Вот соответствующая выдержка из Обобщения и коллекции Java :
2.4.Принцип «получить и положить»
Хорошей практикой может быть вставка подстановочных знаков, когда это возможно, но как вы решаете, какой подстановочный знак использовать?Где вы должны использовать extends
, где вы должны использовать super
, и где вообще не следует использовать подстановочный знак?
К счастью, простой принцип определяет, что уместно.
Принцип Get и Put : используйте подстановочный знак extends
, когда вы только получаете значения из структуры, используйте подстановочный знак super
, когда вы только помещаете значения в структуру, и неиспользуйте подстановочный знак, когда вы получаете и ставите.
Мы уже видели этот принцип в работе в сигнатуре метода копирования:
public static <T> void copy(List<? super T> dest, List<? extends T> src)
Метод получает значения изsource src, поэтому он объявляется с подстановочным знаком extends
и помещает значения в целевую dst, поэтому он объявляется с подстановочным знаком super
.Всякий раз, когда вы используете итератор, вы получаете значения из структуры, поэтому используйте подстановочный знак extends
.Вот метод, который берет коллекцию чисел, преобразует каждое в двойное и суммирует их:
public static double sum(Collection<? extends Number> nums) {
double s = 0.0;
for (Number num : nums) s += num.doubleValue();
return s;
}