Разница между ArrayList <>() и ArrayList <>() {}

В чем разница между этими двумя. Почему последние создают новый сериализуемый класс?

new ArrayList<Clazz>() 

создает новый пустой ArrayList

new ArrayList<Clazz>(){}

Eclipse показывает: The serializable class does not declare a static final serialVersionUID field of type long

Ответ 1

В первом примере вы создаете экземпляр ArrayList. В последнем случае вы создаете экземпляр анонимного подкласса ArrayList. Обычно вы переопределяете один или несколько методов в подклассе , иначе нет смысла создавать такие. Как указывает Джон Скит, есть одна хакерская причина для создания анонимного подкласса родового типа, см. его ответ.

Eclipse предупреждает, что для соответствия спецификациям Serializable (ArrayList is Serializable, поэтому все его подклассы тоже), вы должны определить уникальный serialVersionUID в подклассе, из которого десериализация процесс может гарантировать, что определение класса не претерпело существенных изменений, поскольку оно было сериализовано (значительно), вы сами решили, что новое определение несовместимо со старым, поэтому вы можете выразить этот факт, изменив serialVersionUID). Если вы никогда не собираетесь сериализовать список, тогда предупреждение не имеет значения.

Ответ 2

Как пишет Joonas, во втором примере вы создаете анонимный внутренний класс. Тем не менее, есть основания для этого, даже если вы не переопределяете какие-либо методы и т.д.: Он позволяет определить тип элемента ArrayList во время выполнения, потому что суперкласс обычного анонимного класса ArrayList<Clazz> чем просто ArrayList.

Вот как работают литералы типа в Guice. Это немного уродливый взлом, но он выполняет свою работу...