Java Generics: установить Список суперкласса, используя Список подкласса - PullRequest
7 голосов
/ 24 марта 2010

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

setSuperClassList(List<Superclass>)

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

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

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

Ответы [ 4 ]

21 голосов
/ 24 марта 2010

Попробуйте setSuperClassList(List<? extends Superclass>).

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

5 голосов
/ 24 марта 2010

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

setSuperClassList(List<? extends Superclass>)

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

В заявлении List<Superclass> говорится, что список может содержать только SuperClass. Это исключает любые подклассы.

1 голос
/ 24 марта 2010

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

Попробуйте setSuperClassList(List<? extends Superclass>).

0 голосов
/ 24 марта 2010

Do:

setSuperClassList(List<? extends Superclass> list)

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

...