[英]Passing a subclass to a method with an abstract class parameter
我一直试图了解这个例子发生了什么,但到目前为止还没有。 任何人都可以帮忙吗?
假设我有这两个抽象类:
public abstract class AbstractBook<T extends AbstractPage> implements Serializable{
public AbstractBook() {
}
public abstract void addPage(T var1);
}
和
public abstract class AbstractPage implements Serializable {
public AbstractPage() {
}
}
以及像这样扩展的类:
public class Book extends AbstractBook {
private ArrayList<Page> allPages;
private String title;
Book(String title){
allPages = new ArrayList<Page>();
}
@Override
public void addPage(AbstractPage page) {
this.allPages.add();
}
}
和
public class Page extends AbstractPage {
private String content;
public Page(String Content){
this.content = Content;
}
}
在Book
类中有一个名为addPage
的方法。 但是,我可以将Page
类对象传递给此方法; 我无法将该对象添加到ArrayList<Page> allPages
。
为什么会这样? 我的意思是我认为这是因为编译器需要类型AbstractPage
而不是Page
。 但是为什么我能够调用thisbook.addPage(pageObject)
类的方法?
所以换句话说,它让我传递一个子类对象,但它不允许我对传递的对象做任何事情。
你如何解决这个问题,以便我可以将该 pageObject 添加到ArrayList<Page> allPages
结构?
您可以通过修改Book
类来使其工作:
public class Book extends AbstractBook<AbstractPage> {
private ArrayList<AbstractPage> allPages;
private String title;
Book(String title){
allPages = new ArrayList<AbstractPage>();
}
@Override
public void addPage(AbstractPage page) {
this.allPages.add(page);
}
}
在定义类Book
时,您应该使用AbstractBook
的类型参数。 如果要插入这种类型的元素,则ArrayList
必须是AbstractPage
类型。
您不能将AbstractPage
添加到Page
的列表中,因为Page
是从AbstractPage
继承的一级: Object
<- AbstractPage
<- Page
。 如果要将Page
s 添加到列表中,则必须扩展AbstractBook<Page>
:
public class Book extends AbstractBook<Page> {
private ArrayList<Page> allPages;
private String title;
Book(String title){
allPages = new ArrayList<Page>();
}
@Override
public void addPage(Page page) {
this.allPages.add();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.