2016-10-17 6 views
2

я часто сталкиваюсь с ситуациями, как:разница между списком типов объектов и списком объектов, простирающегося типом

List<Fooable> fooList; 

против

List<? extends Fooable> fooList; 

В чем разница между этими двумя? Или есть имя для этой/ранее существовавшей ссылки, где описано это различие? Я не могу использовать эту концепцию Google, потому что я не знаю, как она называется, или как иначе вы ее описали.

Имеет ли значение, является ли Fooable интерфейсом? Конкретный класс? Абстрактный класс? Это относится только к классам, которые расширяют и/или реализуют что-то?

+2

Я считаю, что на это отвечает. http://stackoverflow.com/questions/4343202/difference-between-super-t-and-extends-t-in-java –

+0

Или здесь http : //programmers.stackexchange.com/questions/303584/what-is-the-difference-between-extends-foo-and-foo –

+0

Что касается имени этой конструкции, она называется «верхним ограниченным шаблоном», см. Пример https://docs.oracle.com/javase/tu torial/java/generics/upperBounded.html – user140547

ответ

1

Ну если нет дубликата ...

List<Animal>может содержатьCat с и Dog с. Вы можете добавить кошек и собак в список. Это не значит, что он может содержать только Animal s.

Но если у вас есть способ foo(List<Animal> foo), вы не можете передать ему List<Cat>. Но вы можете добавить Cat s, Dog s или Animal s в поле принятое List<Animal>.

Если у вас есть foo(List<? extends Animal> foo), вы можете передать List<Animal>, List<Dog> и List<Cat> к нему и читать из него, то есть вы можете получить доступ к Animal сек методы.

Но поскольку любой Список подтипа Animal может быть передан на него (вы не знаете, какой тип, это может быть Animal, Cat или Dog, или некоторые совершенно разные Animal, вы не можете добавлять любые элементы (за исключением null).

+0

Это произвольное ограничение? Я бы предположил, что 'foo (List foo)' будет принимать 'List ', поскольку Cat является животным –

+0

см. Https://stackoverflow.com/questions/2745265/is-listdog-a-subclass-of-listanimal- почему-arent-javas-generics-implicitly-p – user140547

+0

Итак, в основном, ответ заключается в том, что дженерики Java работают очень интригуально. –

Смежные вопросы