Дано:
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.
Ответы A и B для меня совершенно ясны. Для ответов C и D я знаю, каким образом происходит наследование, однако я не могу понять, почему ответ D не компилируется в Eclipse, пока все остальные (A с warrning о generic, B и C без warrings).
Ошибка в Eclipse для ответа D The 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
является окончательным классом и не может быть расширен каким-либо другим классом, но это не объясняет мне, что здесь происходит.