Java - 多态性问题

时间:2010-03-16 16:18:21

标签: java arrays polymorphism arraylist

我有一本书课,然后是一本小说和一本科学书类,扩展了这本书。

我使用书类创建了一个ArrayList,然后将小说和科学书籍插入其中。现在我试图遍历ArrayList来计算那里有多少小说。我该怎么说?

很想看到一些这样的例子!我已经有一段时间了。

5 个答案:

答案 0 :(得分:5)

使用instanceof

e.g。

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

或者,使用foreach:

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

答案 1 :(得分: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++;
}

答案 2 :(得分:4)

尽管Froadie说instanceof允许您检查每个元素的具体类型是正确的,但这通常表明您的设计存在问题。

可能值得考虑为什么你必须知道小说的数量。你想在书上不存在的小说上调用一种方法吗?您为所有书籍使用的集合可能是错误的分组书籍吗?如果你想提供一些计算某种方法的方法,是否值得考虑一种方法来抽象出书籍的计算方式?

如果您发现此案例不会引起设计问题,instanceof就是您的答案。

答案 3 :(得分:2)

你可以沿着这些方向做点什么:

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

if语句只对新对象的对象成立,即科学书对象在if语句中返回false,因此不计算。

答案 4 :(得分:0)

可以使用instanceofbook.getClass.equals(Novel.class)。无论哪种方式都在for循环中遍历ArrayList:

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