java - 从父类(super class)的arraylist访问子类方法

标签 java arraylist

对于赋值,我有一个类型为“Reference”的 ArrayList。 Reference 是“Book”类和“Journal”类的父类。如果允许我将“Book”和“Journal”类型的对象添加到 Arraylist,如果我想通过以下代码访问 Book 和 Journal 的方法,为什么会出现错误?

          ArrayList.get([someindex]).someBookorJournalMethod()

arraylist 本身是父类的,我想访问的方法只是为任何一本书或任何一本期刊定义的。

编辑:这是一些代码

  public class Books extends Reference{

   private String Authors;
   private String Publishers;


      public Books(String CallNum, String Author, String Title, String Publisher, int year,String type)
      {

          super(CallNum,Title,year,type);

          Authors= Author;
          Publishers=Publisher;
      }

public String getAuthor()
{
    return Authors;
}



 public class LibrarySearch {


      private ArrayList<Reference> Library;


      public LibrarySearch()
      {
          Library = new ArrayList<Reference>(100);
      }


      public outputLibrary(){

      for (int i = 0 ; i < Library.size(); i+++)
      {
        if (Library.get(i).getType().equals("Book"))
        {
            System.out.println("Type:book\n" + "Call Number:" +  Library.get(i).getCallNumber() +"\n" + "Authors:" + Library.get(i).getAuthors();)
        }
    }

}

IntelliJ 对行 Library.get(i).getAuthors() 有问题,因为它是特定于 Books 的方法。我将如何解决这个问题?

最佳答案

因为当你指定一个变量的类型时,你只能调用为这个类型定义的方法。例如,如果您有

public class A {
  public void methodA() {
    System.out.println("A");
  }
}

public class B extends A {
  public void methodB() {
    System.out.println("B");
  }
}

public class Main {
  public static void main(String[] args) {
    A ab = new B();
    ab.methodB();
  }
}

这不会编译,因为为变量 ab 定义的类型是 A 并且唯一可见的方法是那些在 A 中定义的方法>.

在你的情况下,你可以简单地在 Reference 中添加一个空白方法(如果你不想使类抽象):

public void someBookorJournalMethod() {}

或者您可以显式转换要为其调用方法的对象。

但是,请务必注意,这两种方法通常都是不好的做法,应该避免。如果实例化 Reference 对象没有意义,那么将类设为 abstract 并将 someBookorJournalMethod 定义为抽象方法。在您的代码中,您很可能以错误的方式使用了继承。

关于java - 从父类(super class)的arraylist访问子类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33589451/

相关文章:

java - Java 未检测到死锁

java - Web 服务触发另一个 Web 服务?

java - 授予权限后刷新谷歌地图(Android Java)

java - 是否可以将有序收集器与并行流一起使用?

java - 并发 - 中断 Future 而不取消它

java - 打印对象的数组列表

java - 将元素添加到 List<Map.Entry<Integer,Integer>>

java - 如何创建数组的 ArrayList

java - 从 Arraylist 返回对象

java - 搜索具有特定范围内的属性值的对象的 ArrayList