为什么双括号初始化要求SerialVersionUID?

public static List abc = new ArrayList(){{ //Asks for SerialVersionUID abc.add(5L); abc.add(7L); }}; public static List abc = new ArrayList();//Does not need SerialVersionUID static{ abc.add(5L); abc.add(7L); } 

在第二个示例中,您将实例化一个已经定义了serialVersionUID (即ArrayList )。

在第一个示例中,您将定义ArrayList的匿名子类,并且您的子类需要定义自己的serialVersionUID 。 双括号初始化实际上定义了一个匿名类并不总是显而易见的。

因为在您的第一个示例中,您通过“双括号初始化”创建了ArrayList的匿名子类,并且ArrayList实现了Serializable接口。 SerialVersionUID用于反序列化,提供一个是很好的做法,尽管不是绝对必要的。 您的IDE可能配置为报告这些警告。

在第二个示例中,您没有创建ArrayList的匿名子类,只是实例化一个并调用其方法。