【发布时间】:2019-07-08 03:14:46
【问题描述】:
我一直试图了解这个示例发生了什么,但到目前为止还没有做到。有人可以帮忙吗?
假设我有这两个抽象类:
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 结构中?
【问题讨论】:
-
我想这是因为不是所有的 AbstractPage 都是 Page 的,你可以尝试为此使用一个接口。
-
通常抽象类对于参数来说是一个糟糕的类型;尝试从接口的角度重新考虑它。
-
@9000 我也是这么想的。您认为还有另一种方法可以覆盖
addPage方法吗?它不允许我只放置页面类型参数<T extends AbstractPage>听起来应该,但我想我错了。 (我不允许更改抽象类中的任何内容) -
我无法将该对象添加到 ...
allPages。那是因为您发布的这行代码无法编译:this.allPages.add();
标签: java inheritance