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

时间:2019-07-08 03:14:46

标签: java inheritance

我一直在尝试了解此示例所发生的情况,但到目前为止还没有弄清楚。有人可以帮忙吗?

说我有这两个Abstract类:

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

2 个答案:

答案 0 :(得分:0)

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

定义类AbstractBook时,应使用Book的类型参数。如果要插入此类型的元素,则ArrayList的蜜蜂类型必须为AbstractPage

答案 1 :(得分:0)

您不能将AbstractPage添加到Page的列表中,因为就Page的继承而言,AbstractPage是上一级的:Object < -AbstractPage <-Page。如果要将Page添加到列表中,则必须扩展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();
    }
}