ковариантность дженериков Java

Я испытываю затруднения при понимании следующей статьи: http://www.ibm.com/developerworks/java/library/j-jtp01255.html

Под,

Дженерики не являются ковариантными

состояния автора,

Поскольку маршрутом является Список, добавляя, что Плавание к нему кажется совершенно законным. Но если бы ln были искажены с литием, то он нарушил бы обещание безопасности типов, неявное в определении лития - что это - список целых чисел, который является, почему универсальные типы не могут быть ковариантными.

Я не могу понять часть, где она говорит, "если ln были искажены с литием". То, что делает автора, подразумевает под псевдонимом? (ссылка?). Фрагмент кода выше заключенной в кавычки строки, кажется, иллюстрирует то, ЧТО недопустимо в Java и не ПОЧЕМУ. Мне было бы очень полезно, если кто-то мог бы объяснить с примером.Заранее спасибо.

20
задан soocracy42 18 April 2010 в 02:09
поделиться

2 ответа

List<Integer> li = new ArrayList<Integer>();
List<Number> ln = li; // illegal
ln.add(new Float(3.1415));

В Java, Целое число наследуется от числа (java.lang.Number) , поэтому интуитивно понятно, что все, что является целым числом (java.lang.Integer) , также является числом, но на что указывает эта статья в том, что с универсальными шаблонами это не работает, потому что, учитывая этот пример, вы можете в конечном итоге поместить число с плавающей запятой (которое является числом) в List , что недопустимо, потому что число с плавающей запятой не является целое число.

Заключение: Обобщения не ковариантны.

Примечание: Я рекомендую вам прочитать Эффективная Java (2-е издание), Глава 5: Обобщения.

41
ответ дан 29 November 2019 в 23:23
поделиться

Если бы вы могли сделать что-то вроде этого:

List<Float> foo;
List<Object> bar;

foo = new ArrayList<Float>();
bar = foo;

foo.add(1.0f);
bar.add("Hello");

, все пошло бы ОЧЕНЬ неправильно. В этом примере bar является псевдонимом для foo, и если бы вы могли это сделать, вы бы потеряли безопасность типа, которая является основной причиной существования дженериков.

9
ответ дан 29 November 2019 в 23:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: