[英]Accessing subclass method from arraylist of superclass
对于赋值,我有一个类型为“Reference”的ArrayList。 Reference是“Book”类和“Journal”类的父类。 如果允许我向Arraylist添加“Book”和“Journal”类型的对象,如果我想通过以下代码访问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
定义为抽象方法。 在您的代码中,您最有可能以错误的方式使用继承。
您无法从超类访问子类的方法。 因此,您需要投射到书籍或期刊。
Reference r =ArrayList.get([someindex]);
if (r instanceof Book) {
((Book) r).someBookMethod();
} else if (r instanceof Journal) {
((Journal) r).someJournalMethod();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.