java - 将子类传递给具有抽象类参数的方法

标签 java inheritance

我一直试图理解这个例子发生了什么,但到目前为止还无法理解。有人可以帮忙吗?

假设我有这两个抽象类:

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结构?

最佳答案

您可以通过修改 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);
  }
}

在定义Book类时,您应该使用AbstractBook的类型参数。如果要插入 AbstractPage 类型的元素,ArrayList 必须为该类型。

关于java - 将子类传递给具有抽象类参数的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56927990/

相关文章:

java - 在 Wildfly 上使用 New Relic 进行部署时出现异常

java - 如何设计可用于测试的伪随机数生成器模式?

c++ - 有没有办法通过指向基的指针复制派生类对象?

scala - 在 Scala 中,特征是否可以扩展需要参数的类?

c++ - 继承下基类的OOPS内存分配?

java - 泛型将子类添加到数组

c++ - C++中继承后如何重写基类的成员

java - 变量不能在绑定(bind)内部使用

java - wurfl 1.4 的 Maven

java - 如何在 Java 中序列化 Microsoft Office 对象?