ArrayList<>()和ArrayList<>(){}之间的区别

11

这两者之间有什么区别?为什么后者会创建一个新的可序列化类?

new ArrayList<Clazz>() 

创建一个新的空 ArrayList

new ArrayList<Clazz>(){}

Eclipse显示:可序列化类没有声明静态的final serialVersionUID 字段,类型为long

2个回答

13
在第一个例子中,你创建了一个 ArrayList 实例。在后面的例子中,你创建了一个 ArrayList 的匿名子类实例。通常情况下,你会在子类中覆盖一个或多个方法,否则创建这样的子类就没有太大的意义。正如John Skeet所指出的那样,有一种巧妙的方法可以创建泛型类型的匿名子类,请参见他的回答
Eclipse警告说,为了遵守 Serializable 规范(ArrayList 是可序列化的,因此其所有子类也是可序列化的),你应该在子类中定义一个唯一的 serialVersionUID,从而使反序列化进程可以确保类定义自被序列化以来没有发生重大改变(重大改变意味着你自己已经确定新定义与旧定义不兼容,所以你可以通过更改 serialVersionUID 来表达这个事实)。如果你永远不打算对列表进行序列化,则该警告无关紧要。

7
正如Joonas所说,在第二个例子中,您正在创建一个匿名内部类。然而,即使您没有覆盖任何方法等,这样做也有原因:它允许您在执行时确定ArrayList的元素类型-因为匿名内部类的超类是ArrayList<Clazz>而不仅仅是ArrayList
这就是Guice中类型字面值的工作方式。这是一个有点丑陋的hack,但它完成了工作...

它如何允许他在运行时确定元素类型? - Louis Rhys
1
如果在实例上调用getClass(),它将返回匿名类。然后调用getGenericSuperclass()方法,该Type将包含适当的信息。 —— @LouisRhys - Jon Skeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接