【问题标题】:Java - problems with polymorphismJava - 多态性问题
【发布时间】:2023-03-08 23:37:01
【问题描述】:

我有一个书籍类,然后是一个小说和一个扩展书籍类的科学书籍类。

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

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

【问题讨论】:

  • 发布您的一些代码。它将帮助我们回答您的问题
  • 这是作业吗?如果是这样,请添加适当的标签...

标签: java arrays polymorphism arraylist


【解决方案1】:

使用instanceof

例如

    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++;
    }
 }

【讨论】:

    【解决方案2】:

    您可以使用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++;
    }
    

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 很好的反馈,当我做更大的事情时,我一定会考虑到这一点。
      【解决方案4】:

      您可以按照以下方式做一些事情:

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

      if 语句仅对 Novel 对象为 true,即科学书籍对象将在 if 语句中返回 false,因此不计算在内。

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

        • 啊,原来如此!谢谢!我试图实现它。
        • instanceof 比这种方法更好。我只是在建议另一种方式。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-03
        • 2018-09-03
        相关资源
        最近更新 更多