Я пытаюсь понять 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, почему его нельзя добавить?
Спасибо!
Спасибо за ответ, но NaturalNumber - это супертип EvenNumber. Почему он не останавливается там (плюс он был создан с помощью ArrayList)? –
Anisotrop
@Fram: Потому что он также может быть 'List' сам, который 'NaturalNumber' не является. И выражение, которое вы назначили ему, не влияет на тип переменной (время компиляции). Если вам нужен «List », вы должны объявить «List ». –
SLaks