Смущает поведение <T extends Class> - PullRequest
0 голосов
/ 08 июля 2019

Итак, у меня есть AbstractBook Класс

public abstract class AbstractBook<T extends AbstractPage> implements Serializable{
    public AbstractBook() {
    }

    public abstract void addPage(T var1);
}

, и у меня есть подкласс:

public class Book extends AbstractBook {

    private ArrayList<Page> allPages;
    private String title;

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

    @Override /** Doesn't Work */
    public void addPage(Page page) {
        this.allPages.add();
    }
}

В методе подкласса addPage я не могу переопределитьметод в данной форме, потому что параметр запрашивает тип AbstractPage, даже если Page расширен от AbstractPage:

public abstract class AbstractPage implements Serializable {
    public AbstractPage() {
    }
}

и

public class Page extends AbstractPage {

  private String content;

  public Page(String Content){
    this.content = Content;
  }
}
  • Почему это именно так?
  • Разве T не определяется как <T extends AbstractPage>, поэтому Page должен быть приемлемым типом для параметра в методе addPage?Он настаивает на том, что компилятор настаивает на AbstractPage типе.
  • Или <T extends AbstractPage> на самом деле не применяется к T var1 в методе addPage?
  • Но даже тогда, что останавливается addPage(Page page) метод от компиляции?

1 Ответ

5 голосов
/ 08 июля 2019

Вы расширяете необработанный тип.

Изменение

public class Book extends AbstractBook

до

public class Book extends AbstractBook<Page>

Кроме того, this.allPages.add();, вероятно, должно быть this.allPages.add(page);.

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