java - 对 <T extends Class> 行为感到困惑

标签 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扩展自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 var1addPage方法?
  • 但即便如此,还有什么能阻止 addPage(Page page)编译方法?

最佳答案

您正在扩展原始类型。

改变

public class Book extends AbstractBook

public class Book extends AbstractBook<Page>

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

关于java - 对 <T extends Class> 行为感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56932478/

相关文章:

java - 计算重复字母

java - Flyway Java 迁移在命令行工具中不起作用

C# 将泛型列表传递给方法,然后转换为类型

c# - c# 中较少定义的泛型?

python - 仅当子类重写某些基类方法时才引发?

java - Kotlin:javaSetter 方法未编译

java - 为什么我的 XML 文件没有加载到 Websphere Virtual Server 中?

java泛型,关于extends和super的说明

c# - 从抽象基类返回规范表示子类是否可以接受?

Java类继承,子类可以访问私有(private)字段,为什么?