【问题标题】:Passing a subclass to a method with an abstract class parameter将子类传递给带有抽象类参数的方法
【发布时间】:2019-07-08 03:14:46
【问题描述】:

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

假设我有这两个抽象类:

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&lt;Page&gt; allPages。

为什么会这样?我的意思是我认为这是因为编译器需要类型AbstractPage 而不是Page。但是为什么我能够调用像thisbook.addPage(pageObject) 这样的方法呢?

所以换句话说,它允许我传递一个子类对象,但它不允许我对传递的对象做任何事情。

您如何解决这个问题,以便我可以将该 pageObject 添加到 ArrayList&lt;Page&gt; allPages 结构中?

【问题讨论】:

  • 我想这是因为不是所有的 AbstractPage 都是 Page 的,你可以尝试为此使用一个接口。
  • 通常抽象类对于参数来说是一个糟糕的类型;尝试从接口的角度重新考虑它。
  • @9000 我也是这么想的。您认为还有另一种方法可以覆盖addPage 方法吗?它不允许我只放置页面类型参数&lt;T extends AbstractPage&gt; 听起来应该,但我想我错了。 (我不允许更改抽象类中的任何内容)
  • 我无法将该对象添加到 ... allPages。那是因为您发布的这行代码无法编译:this.allPages.add();

标签: java inheritance


【解决方案1】:

您可以通过修改 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 类型的蜜蜂。

【讨论】:

    【解决方案2】:

    您不能将AbstractPage 添加到Pages 列表中,因为Page 是从AbstractPage 继承的上一级:Object AbstractPage Page。如果您想将Pages 添加到您的列表中,您必须扩展AbstractBook&lt;Page&gt;:

    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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-29
      • 1970-01-01
      • 2015-10-01
      • 2016-09-30
      • 2021-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多