2010-03-16 2 views
1

나는 책 클래스를 가지고있다. 그 책 클래스를 확장 한 소설 및 과학 도서 클래스가있다.자바 - 다형성의 문제

북 클래스를 사용하여 ArrayList를 만든 다음 소설과 과학 서적을 삽입했습니다. 이제 ArrayList를 반복하여 얼마나 많은 소설이 있는지 계산하려고합니다. 어떻게 알 수 있습니까?

몇 가지 예를보고 싶습니다. 나는 잠시 동안 그곳에 있었다.

+0

일부 코드를 게시하십시오. 귀하의 질문에 대한 답변을 드릴 것입니다 –

+0

이 숙제입니까? 그렇다면 적절한 태그를 추가하십시오 ... – Mikezx6r

답변

4
당신은 객체의 실제 타입 확인 instanceof을 사용할 수 있습니다

:

List<Book> books = new ArrayList<Book>(); 
books.add(aNovel); 
books.add(aScienceBook); 

int novelCount = 0; 

for (Book book : books) { 
    if (book instanceof Novel) 
     novelCount++; 
} 
+0

훌륭합니다, 감사합니다! – cc0

5

instanceof을 사용하십시오.

foreach 문을 사용하여

int numberOfNovels = 0; 
    for(int i = 0; i < arrayOfBooks.length; i++){ 
     if(arrayOfBooks[i] instanceof Novel){ 
      numberOfNovels++; 
     } 
    } 

또는 :

int numberOfNovels = 0; 
for(Book book: arrayOfBooks){ 
    if(books instanceof Novel){ 
     numberOfNovels++; 
    } 
} 
+0

완전한 대답입니다. – SjB

+0

굉장하고 훌륭한 사례. – cc0

2

당신은이 라인을 따라 뭔가를 할 수 :

public int getNovelCount(List<Book> bookList) { 
    int novelCount = 0; 
    for (Book book : bookList) { 
     if (book instanceof Novel) { 
      novelCount++; 
     } 
    } 
    return novelCount; 
} 

if 문은 Novel 객체 인 객체에만 적용됩니다. 즉 과학 서적 객체는 if 문에서 false를 반환하므로 계산되지 않습니다.

4

Froadie가 instanceof은 각 요소의 특정 유형을 확인할 수 있다고 말하면서 옳았지 만, 일반적으로 설계에 문제가 있다는 신호입니다.

을 고려해 볼 가치가 있습니다. 당신은 소설 개수를 알아야합니다. 책에없는 소설에서 메서드를 호출하고 싶습니까? 모든 책에서 사용하고있는 컬렉션이 책을 그룹화하는 잘못된 방법 일 수 있습니까? 당신이 어떤 종류의 계산을하는 방법을 제공하기를 원한다면, 책을 어떻게 계산 하는지를 추상화하는 방법을 고려해 볼 가치가 있습니까?

이 경우 디자인 관련 문제가 발생하지 않는다면 instanceof이 답입니다.

+0

위대한 의견은, 내가 더 큰 것을 할 때 이것을 고려할 것입니다. – cc0

0

instanceof 또는 book.getClass.equals(Novel.class) 중 하나를 사용할 수 있습니다. 어느 쪽이든 루프 for the 루프에있는 ArrayList :

int count = 0; 
for(Book book: books){ 
    if(book.getClass.equals(Novel.class)) count++; 
} 
return count; 
+0

아, 그게 어떻게 작동하는지! 고맙습니다! 나는 그것을 구현하려고 시도했다. – cc0

+0

나중에 JPA를 사용한다면이 방법은 효과가 없습니다. – TJR

+0

instanceof이 방법보다 좋습니다. 나는 다른 길을 제안하고 있었어. – Adam