我一直在尝试了解此示例所发生的情况,但到目前为止还没有弄清楚。有人可以帮忙吗?
说我有这两个Abstract类:
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
结构中?
答案 0 :(得分:0)
您可以通过修改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);
}
}
定义类AbstractBook
时,应使用Book
的类型参数。如果要插入此类型的元素,则ArrayList
的蜜蜂类型必须为AbstractPage
。
答案 1 :(得分:0)
您不能将AbstractPage
添加到Page
的列表中,因为就Page
的继承而言,AbstractPage
是上一级的:Object
< -AbstractPage
<-Page
。如果要将Page
添加到列表中,则必须扩展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();
}
}