Я пытаюсь создать иерархию классов, начиная с абстрактного класса с общим типом. И затем используйте расширенный тип родового во 2-м поколении классов детей. Поскольку я уверен, что не ясно, вот пример:Java generics hierarchy
Идея заключается в том, чтобы иметь таблицу элементов, поэтому в основном:
abstract class AbstractTableOfItems<T>
-> Родовой тип таблицы
class Foo
-> Один тип элемента
class Bar
-> Другой тип по пункту
class SonOfFoo extends Foo
class TableOfFoo extends AbstractTableOfItems<Foo>
class TableOfBar extends AbstractTableOfItems<Bar>
До сих пор так хорошо, все в порядке (не будем заботиться о содержании классов, это не пункт здесь).
Но тогда я хочу таблицу SonOfFoo
, и я хочу, чтобы она расширялась TableOfFoo
, так как SonOfFoo
наследует от Foo
. Это не представляется возможным. Возможно, я думаю не так, но я просто не понимаю, почему.
class TableOfSonOfFoo extends TableOfFoo
компилирует, но не так, потому что он все равно будет таблица Foo
, общий тип, используемый будучи Foo
.
class TableOfSonOfFoo extends TableOfFoo<SonOfFoo>
не компилируется, так как общий тип на AbstractTableOfItems
.
Так хорошо я говорю, давайте попробуем переопределить TableOfFoo
, чтобы он мог принять наследство:
class TableOfFoo extends AbstractTableOfItems<? extends Foo>
неправильно снова, «супертип не может указать любую подстановку» (я не уверен, что я полностью понимаю вот этот).
Я не могу прикоснуться к AbtractTableOfItems
, так как он не будет таким общим, каким я хочу. Поэтому я немного застрял здесь. Я понимаю, что это сработало бы, только имея TableOfSonOfFoo
наследовать напрямую от AbstractTableOfItems
, но тогда я потеряю все реализации от TableOfFoo
.
Я мог бы обойти это, но я пытаюсь думать об иерархии и понимать, почему это не сработает.
Я знаю, но я давал альтернативу этой части его вопроса 'class TableOfFoo extends AbstractTableOfItems extends Foo> '. Я не думаю, что весь вопрос легко подотчетен. –
Спасибо, это похоже на работу. Недостатком является каждый раз, когда я использую тип «F» и класс TableOfFoo, я должен явно передать его Foo, пока он был неявным раньше. Но он действительно работает таким образом. «Возможно, вы хотите проверить свой дизайн и посмотреть, можете ли вы упростить вещи, используя агрегацию вместо наследования». Возможно, действительно, я не настолько уверен в актуальности этого дизайна. – Zazou
@ Zazou это звучит нехорошо. вам не нужно бросать при правильном использовании дженериков. Возможно, вы должны задать следующий вопрос для этого вопроса: –