对于赋值,我有一个类型为“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/