#java #generics #collections
#java #общие #Коллекции
Вопрос:
Может кто-нибудь, пожалуйста, дайте мне понять, почему этот фрагмент кода выдает ошибку компилятора:
List<? super A> superList = new ArrayList<>();
superList.add(new Object());
Хотя это совершенно правильно:
setSuper(new ArrayList<Object>());
public void superMethod(List<? super A> list) {
//...
}
Я понимаю, что нижняя граница сужает доступные типы до A или их потомков, но почему это подходит для компилятора, когда дело доходит до аргументов методов?
Ответ №1:
An ArrayList<Object>
— допустимое значение типа List<? super A>
.
An ArrayList<A>
также является допустимым значением типа List<? super A>
.
Но вы не можете добавить new Object()
в ArrayList<A>
. Таким образом, не все List<? super A>
значения могут добавлять объект, поэтому компилятор корректно выдает ошибки.