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<>();
Ответ 1 · Veselin Davidov
Разницы в первых двух нет. Второй - это короткая версия первого, добавленного в java 7 (я думаю)
Во-вторых, вы объявляете общий список Java (в объявлении не говорится, что это целочисленный список). Затем вы даете этой переменной экземпляр ArrayList. Это то, что вы делаете коротышка и не в декларации. Вот почему код компилируется (вы можете добавить строку, потому что экземпляр списка массивов может быть чем угодно). Но это не удастся во время выполнения, потому что в этом текущем запуске экземпляр представляет собой список целых чисел.
Когда вы объявляете его ArrayList myList, тогда он знает время компиляции, что этот список может иметь только целые числа, и компиляция завершается ошибкой.