从超类的arraylist访问子类方法

时间:2015-11-08 00:34:26

标签: java arraylist

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

  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();)
        }
    }

}

arraylist本身属于父类,我想要访问的方法仅为书籍或期刊定义。

编辑:这是一些代码

getAnswer

IntelliJ遇到了Library.get(i).getAuthors()行的问题,因为它是一种特定于Books的方法。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

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

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定义为抽象方法。在您的代码中,您最有可能以错误的方式使用继承。

答案 1 :(得分:0)

您无法从超类访问子类的方法。因此,您需要投射到书籍或期刊。

Reference r =ArrayList.get([someindex]);
if (r instanceof Book) {
    ((Book) r).someBookMethod();
} else if (r instanceof Journal) {
     ((Journal) r).someJournalMethod();
}