2014-11-06 3 views
0

Я пытаюсь понять Java Generics, и я озадачен ограниченными подстановочными знаками. Я использую иерархию из Guidelines for Wildcard Use и добавил класс PositiveEvenNumber, наследующий от EvenNumber.Явный общий шаблон Java, ограниченный в списках

List<? super EvenNumber> xn = new ArrayList<NaturalNumber>(); 
    xn.add(new NaturalNumber(35)); // compile-time error 
    xn.add(new EvenNumber(-70)); 
    xn.add(new PositiveEvenNumber(70)); 
    xn.add(new Object()); // compile-time error 

Почему первая строка компилируется? Во второй строке не является NaturalNumber родителем EvenNumber, почему его нельзя добавить?

Спасибо!

ответ

2

List<? super EvenNumber> является список некоторых конкретного типа, при условии, что этот тип является супертипом EvenNumber.

Таким образом, это может быть List<EvenNumber>, и в этом случае вы не можете добавить NaturalNumber.

Это также означает, что вы ничего не можете прочитать из списка (кроме Object), так как вы не знаете, какой тип содержит список. (это может быть даже List<Object>)

+0

Спасибо за ответ, но NaturalNumber - это супертип EvenNumber. Почему он не останавливается там (плюс он был создан с помощью ArrayList )? – Anisotrop

+0

@Fram: Потому что он также может быть 'List ' сам, который 'NaturalNumber' не является. И выражение, которое вы назначили ему, не влияет на тип переменной (время компиляции). Если вам нужен «List », вы должны объявить «List ». – SLaks