Коллекция с дженериками - PullRequest
       15

Коллекция с дженериками

5 голосов
/ 20 января 2012

У меня есть вопрос об использовании дженериков с коллекциями.

ArrayList<Integer> al=new ArrayList<Integer>();

Мы знаем, что приведенная выше строка означает, что ArrayList al ограничено, чтобы содержать только целые числа Поэтому следующая строка выдает ошибку компиляции:

al.add("wwww");

Но я не понимаю, что означает нижеследующая строка,

ArrayList al=new ArrayList<Integer>();

Где мы не даем ArrayList<Integer> слева при объявлении. Теперь следующая строка не выдает ошибку компиляции:

al.add("wwww");

Так что, если я объявлю как

ArrayList al=new ArrayList<Integer>();

что значит a1 может принимать любые типы?

В чем разница между этими двумя декларациями?

Ответы [ 6 ]

9 голосов
/ 20 января 2012

Последнее объявление (без универсального типа) устарело и устарело.Вы не должны использовать его, он компилируется только для обратной совместимости.Современные IDE будут генерировать здесь предупреждение.

Также обратите внимание, что Java принудительно применяет только универсальные типы во время компиляции, поэтому технически вы можете добавить неправильный тип в коллекцию с некоторыми дополнительными приведениями.Поэтому лучше постоянно пользоваться дженериками и не обходить их стороной.

5 голосов
/ 20 января 2012

С этим кодом:

ArrayList al = new ArrayList<Integer>();
a1.add("www");

компилятор сгенерирует предупреждение (на которое следует обратить внимание!), Но код будет работать без ошибок.Проблема возникает при извлечении данных из a1.Если вы «знаете», что он содержит Integer значений, вы можете просто сделать это:

Integer val = (Integer) a1.get(index);

Но когда вы нажмете на элемент "www", вы получите ClassCastException.Обобщения предназначены для того, чтобы перемещать такие ошибки во время компиляции, а не заставлять плохого разработчика отслеживать, как значение String попало в этот список Integer массива.

0 голосов
/ 20 января 2012

Этот вид объявления разрешен для обратной совместимости.Например, вы можете передать свой общий список методу из библиотеки старого стиля, которая принимает только необработанный список:

List<Integer> list = new ArrayList<Integer>();
OldStyledClass.method(myArray);

, где метод объявлен как:

public static void method(List list)...

В этом случаеу вас есть несколько специальных служебных методов в java.util.Collections.Таким образом, вы можете перейти к этому защищенному списку метода:

OldStyledClass.method(Collections.checkedList(myArray, Integer.class));

Если метод попытается поместить в ваш список объект какого-либо другого типа, вы сразу получите ClassCastException.

0 голосов
/ 20 января 2012

Обобщения реализуются с помощью стирания типа: информация об универсальном типе присутствует только во время компиляции, после чего она стирается компилятором. Итак, объявление ArrayList позволяет компилятору принимать любой тип. Вот Java документ по этой теме.

0 голосов
/ 20 января 2012

вы должны написать так ArrayList<Integer> al=new ArrayList<Integer>();, чтобы избежать добавления в ваш список объектов с другими типами, потому что вы увидите ошибку компиляции.Конечно, вы можете использовать ArrayList al=new ArrayList<Integer>();, но тогда вы должны быть осторожны.Другими словами, всегда используйте первый: D

0 голосов
/ 20 января 2012

Последнее объявление в основном совпадает с:

ArrayList<Object> al=new ArrayList<Object>();

, таким образом, принимая любой Объект.Его не следует использовать, и его можно использовать для обеспечения обратной совместимости с Java (до Java1.5).

...