与<T扩展Class>行为混淆

C. *_* O. 0 java generics inheritance

所以我有这个AbstractBook

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

    public abstract void addPage(T var1);
}
Run Code Online (Sandbox Code Playgroud)

我有一个子类:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

在子类addPage方法中,我无法以给定的形式覆盖该方法,因为该参数要求是一种AbstractPage类型,即使它Page是从扩展而来的AbstractPage

public abstract class AbstractPage implements Serializable {
    public AbstractPage() {
    }
}
Run Code Online (Sandbox Code Playgroud)

public class Page extends AbstractPage {

  private String content;

  public Page(String Content){
    this.content = Content;
  }
}
Run Code Online (Sandbox Code Playgroud)
  • 到底为什么呢?
  • T定义为<T extends AbstractPage>,因此Page应该是addPagemethod中参数的可接受类型吗?它坚持编译器坚持AbstractPage类型。
  • 还是<T extends AbstractPage>不适用于T var1addPage方法?
  • 但是即使如此,什么阻止了addPage(Page page)方法的编译呢?

Era*_*ran 5

您正在扩展原始类型。

更改

public class Book extends AbstractBook
Run Code Online (Sandbox Code Playgroud)

public class Book extends AbstractBook<Page>
Run Code Online (Sandbox Code Playgroud)

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