передача подкласса в метод с абстрактным параметром класса - PullRequest
0 голосов
/ 08 июля 2019

Я пытался понять, что происходит с этим примером, но пока не смог.Кто-нибудь может помочь?

Скажите, у меня есть два абстрактных класса:

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 голосов
/ 13 июля 2019

Нельзя добавить AbstractPage в список Page с, поскольку Page на один уровень выше с точки зрения наследования от AbstractPage: Object <- <code>AbstractPage <- <code>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();
    }
}
0 голосов
/ 13 июля 2019

Вы можете заставить его работать, изменив класс 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, если вы хотите вставить элементы этого типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...