Я понимаю, что использование подстановочного знака с нижним ограничением в списке в качестве параметра метода должно позволить поместить элементы этой нижней границы и ее супертипы, но рассмотрим следующий код:
public class WildcardError {
void foo(List<? super Number> i) {
i = new ArrayList<Integer>(); //compile error
i.add(new Integer(2)); // no error
}
}
Теперь я понимаю, почемуявляется ошибкой компиляции в первом утверждении метода foo, так как ArrayList из Integer не является подтипом списка «? super Number», но тогда почему мы можем поместить Integer в этот список, даже если целое число не является супертипом Number?И наоборот, в следующем коде:
public class WildcardError {
void foo(List<? super Integer> i) {
i = new ArrayList<Number>(); //no error
Number k =20;
i.add(k); // compile error
}
}
Здесь я понимаю, что в операторе 2 не должно быть ошибки компиляции, поскольку ArrayList of Number является подтипом списка «? Super Integer», но почемутам ошибка компиляции в последнем утверждении?
Хотя?super Integer должен содержать номер суперкласса.
Я пытался найти ответ, но не могу найти точный сценарий.