Метод с нижним ограниченным шаблоном

#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> значения могут добавлять объект, поэтому компилятор корректно выдает ошибки.