Дженерики Java: сетлист суперкласса с помощью Списка подкласса

Если у меня есть метод в MyClass такой как

setSuperClassList(List<Superclass>)

... если я могу сделать это:

new MyClass().setSuperClassList(new ArrayList<Subclass>())

Кажется, что это не скомпилирует. Почему?

8
задан jjnguy 24 March 2010 в 20:34
поделиться

4 ответа

Попробуйте setSuperClassList(List).

Также проверьте PECS, чтобы узнать, следует ли использовать ? extends или ? super.

22
ответ дан 5 December 2019 в 05:44
поделиться

Он не будет компилироваться, поскольку java.util.List не является ковариантным .

Попробуйте вместо этого setSuperClassList (List ) .

1
ответ дан 5 December 2019 в 05:44
поделиться

Вы просто делаете дженерики немного неправильно. Добавьте бит ? extends, и это позволит передаваемому списку содержать суперкласс или любой из его подклассов.

setSuperClassList(List<? extends Superclass>)

Это называется установлением верхней границы для дженериков.

Утверждение List говорит, что список может содержать только SuperClass. Это исключает любые подклассы.

6
ответ дан 5 December 2019 в 05:44
поделиться

Do:

setSuperClassList(List<? extends Superclass> list)

Это позволит получить список из любого подкласса Суперкласса.

0
ответ дан 5 December 2019 в 05:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: