Разница для <? super / extends String> в объявлении метода и переменной
Дано:
import java.util.*;
public class Hancock {
//insert code here
list.add("foo");
}
}
Какие два фрагмента кода, вставленные независимо в строку 5, будут компилироваться без предупреждений? (Выберите два)
A. public void addString(List list) {
B. public void addString(List<String> list) {
C. public void addString(List<? super String> list) {
D. public void addString(List<? extends String> list) {
Правильные ответы B & C.
Ответы А и Б для меня вполне понятны. Что касается ответов C & D, я знаю, в каком направлении идет наследование, однако я не могу понять, почему ответ D не компилируется в Eclipse, в то время как все остальные делают (A с предупреждением об общем, B & C без ограничений).
Ошибка в Eclipse для ответа DThe method add(capture#1-of ? extends String) in the type List<capture#1-of ? extends String> is not applicable for the arguments (String)
.
С другой стороны это компилирует:
public void addString() {
List<? extends String> list1 = new ArrayList<String>();
List<? super String> list2 = new ArrayList<String>();
}
Зачем? Зачем<? super String>
не компилируется в объявлении метода, в то время как компилируется в объявлении переменной.
я знаю этоString
является последним классом и не может быть расширен никаким другим классом, но это не объясняет мне, что здесь происходит.