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

Ответы на вопрос(2)

Ваш ответ на вопрос