2011-10-17 133 views
11

这两者之间有什么区别。为什么后者会创建一个新的可序列化的类?ArrayList <>()和ArrayList <>(){}之间的区别

new ArrayList<Clazz>() 

创建一个新的空ArrayList

​​

Eclipse中显示:The serializable class does not declare a static final serialVersionUID field of type long

回答

13

在第一个例子,你创建一个ArrayList实例。在后者中,您正在创建ArrayList的匿名子类的实例。通常你会覆盖子类中的一个或多个方法, ,否则创建这样的方法没有多大意义。 正如John Skeet指出的那样,创建一个通用类型的匿名子类有一个原因,参见his answer

Eclipse的警告,为了坚持Serializable规格(ArrayListSerializable,所以它的所有子类都太),你应该定义在子类中的独特serialVersionUID从反序列化过程可以保证类定义自序列化以来并没有明显改变(很明显,您自己已决定新定义与旧定义不兼容,因此您可以通过更改serialVersionUID来表达这一事实)。如果你永远不会序列化这个列表,那么这个警告并不重要。

+2

匿名子类。为什么我如此盲目...... –

7

正如Joonas所说,在第二个例子中,你正在创建一个匿名的内部类。然而,的一个理由,即使你没有重写任何方法等等:它允许你在执行时确定ArrayList的元素类型 - 因为匿名内部类的超类是ArrayList<Clazz>而不仅仅是ArrayList

这是类型文字在Guice中的工作方式。这是一个丑陋的黑客,但它完成了工作...

+0

它如何让他在运行时确定元素类型? –

+1

@LouisRhys:如果你在实例上调用'getClass()',它会给出匿名类。如果您然后调用'getGenericSuperclass()''Type'将会有适当的信息。 –

相关问题