繁体   English   中英

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

[英]Passing a subclass to a method with an abstract class parameter

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

假设我有这两个抽象类:

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的类型参数。 如果要插入这种类型的元素,则ArrayList必须是AbstractPage类型。

您不能将AbstractPage添加到Page的列表中,因为Page是从AbstractPage继承的一级: Object <- AbstractPage <- Page 如果要将Page s 添加到列表中,则必须扩展AbstractBook<Page>

public class Book extends AbstractBook<Page> {

    private ArrayList<Page> allPages;
    private String title;

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

    @Override
    public void addPage(Page page) {
        this.allPages.add();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM