对于赋值,我有一个类型为“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的方法。我该如何解决这个问题?
答案 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();
}