与<T扩展Class>行为混淆

时间:2019-07-08 09:57:20

标签: java generics inheritance

所以我有这个AbstractBook

public abstract class AbstractBook<T extends AbstractPage> implements Serializable{
    public AbstractBook() {
    }

    public abstract void addPage(T var1);
}

我有一个子类:

public class Book extends AbstractBook {

    private ArrayList<Page> allPages;
    private String title;

    Book(String title){
       allPages = new ArrayList<Page>();
    }

    @Override /** Doesn't Work */
    public void addPage(Page page) {
        this.allPages.add();
    }
}

在子类addPage方法中,即使AbstractPage从{扩展了,我也无法以给定的形式覆盖该方法,因为该参数要求是Page类型。 {1}}:

AbstractPage

public abstract class AbstractPage implements Serializable {
    public AbstractPage() {
    }
}
  • 那是为什么呢?
  • 不是将public class Page extends AbstractPage { private String content; public Page(String Content){ this.content = Content; } } 定义为T,因此<T extends AbstractPage>应该是Page方法中参数的可接受类型吗?它坚持要求编译器坚持addPage类型。
  • 或者AbstractPage实际上不适用于<T extends AbstractPage>T var1方法中?
  • 但是即使如此,是什么阻止了addPage方法的编译?

1 个答案:

答案 0 :(得分:5)

您要扩展原始类型。

更改

public class Book extends AbstractBook

public class Book extends AbstractBook<Page>

此外,this.allPages.add();应该是this.allPages.add(page);