3 января 2012 г.

<? super E> и <? extends E> в коллекциях

Многие программисты путают (а некоторые и не знают) эти конструкции при работе с коллекциями. Что же они означают?

Первая означает, что объекты коллекции будут предками для Е, а вторая - объекты, которые являются подтипами Е. Таким образом при использовании <? extends E> мы точно знаем, что объект коллекции будет типа E или его потомком (т.е. совместимым с Е).
Пусть у нас есть такая иерархия:
Parent extends Object
Child extends Parent
и есть очередь LinkedBlockingQueue<Parent>. Мы можем вызвать конструктор данной очереди, передав ей List<Child>, потому что каждый Child является Parent, и мы не можем передать List<Object>, потому что Object может быть не совместим с Parent.

Так же вы можете перенести эту очередь в List<Object>, потому что каждый Parent является Object, но вы не можете перенести очередь в List<Child>, потому что этот лист будет ожидать того, что все элементы будут совместимы с Child.

Таким образом имеем простое правило: extends - для вычитки из коллекции, super - для занесения в коллекцию.

Комментариев нет:

Отправить комментарий

Примечание. Отправлять комментарии могут только участники этого блога.