(я предполагаю, что Bar
и Baz
являются подтипами Foo
.)
List<? extends Foo>
означает список элементов некоторого типа, который является подтипомФу, но мы не знаем, какой тип .Примерами таких списков могут быть ArrayList<Foo>
, LinkedList<Bar>
и ArrayList<Baz>
.
Поскольку мы не знаем, какой подтип является параметром типа, мы не можем поместить объекты Foo
вэто ни Bar
, ни Baz
объекты.Но мы все еще знаем, что параметр типа является подтипом Foo
, поэтому каждый элемент, уже находящийся в списке (и который мы можем получить из списка), должен быть объектом Foo
, поэтому мы можем использовать Foo f = list.get(0);
и аналогичныевещи.
Такой список можно использовать только для удаления элементов из списка, а не для добавления элементов вообще (кроме null
, но я не знаю, позволяет ли это на самом деле компилятор).
A List<Foo>
, с другой стороны, позволяет добавлять любой объект, который является Foo
объектом, а Bar
и Baz
являются подтипами Foo
, все Bar
и Baz
объекты являются Foo
объектами, поэтому их также можно добавлять.