Об ArrayList и универсальном типе

<сильный>1. Во-первых: в чем разница между

ArrayList<Class> myList = new ArrayList<Class>();
ArrayList<Class> myList = new ArrayList<>();

<сильный>2. Второе:

Если я объявлю myList следующим образом:

ArrayList myList = new ArrayList<Integer>();

Почему это все еще работает: myList.add("A String!!");

но НЕ работает с этим объявлением:

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

person Mạnh Nguyễn Đức    schedule 03.01.2018    source источник
comment
Я имею в виду ArrayList myList = new ArrayList‹Integer›();   -  person Mạnh Nguyễn Đức    schedule 03.01.2018
comment
извините за мою невнимательность @Eran   -  person Mạnh Nguyễn Đức    schedule 03.01.2018


Ответы (2)


Разницы в первых двух нет. Второй - это короткая версия первого, добавленного в java 7 (я думаю)

Во-вторых, вы объявляете общий список Java (в объявлении не говорится, что это целочисленный список). Затем вы даете этой переменной экземпляр ArrayList. Это то, что вы делаете коротышка и не в декларации. Вот почему код компилируется (вы можете добавить строку, потому что экземпляр списка массивов может быть чем угодно). Но это не удастся во время выполнения, потому что в этом текущем запуске экземпляр представляет собой список целых чисел.

Когда вы объявляете его ArrayList myList, тогда он знает время компиляции, что этот список может иметь только целые числа, и компиляция завершается ошибкой.

person Veselin Davidov    schedule 03.01.2018

На ваш первый вопрос:

В чем разница между

ArrayList<Class> myList = new ArrayList<Class>();
ArrayList<Class> myList = new ArrayList<>();

Нет никакой разницы. Во втором случае вы позволяете компилятору выполнить вывод типа. определитесь с типом.

На второй вопрос:

Если я объявлю myList следующим образом:

ArrayList myList = new ArrayList<Integer>();

Почему это все еще работает: myList.add("A String!!");

но НЕ работает с этим объявлением:

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

В первом случае вы используете необработанный тип. . Это похоже на использование Object в качестве универсального типа, только хуже. Вы отказываетесь от всех проверок типов во время компиляции, и поэтому в вашем примере вы столкнетесь с Exception.

person Turing85    schedule 03.01.2018
comment
В моем вопросе нет угловой скобки после ArrayList!! Это должно быть: ArrayList test = new ArrayList‹Integer›(); - person Mạnh Nguyễn Đức; 03.01.2018
comment
Я обновил свой ответ. Отвечает ли это на ваш вопрос? - person Turing85; 03.01.2018
comment
ArrayList‹Integer› myList = new ArrayList‹›(); я объявил ArrayList‹› это необработанный тип?? - person Mạnh Nguyễn Đức; 03.01.2018
comment
ArrayList myList = ... — необработанный тип. Пожалуйста, проверьте связанный вопрос. - person Turing85; 03.01.2018