这两者之间有什么区别。为什么后者会创建一个新的可序列化的类?ArrayList <>()和ArrayList <>(){}之间的区别
new ArrayList<Clazz>()
创建一个新的空ArrayList
Eclipse中显示:The serializable class does not declare a static final serialVersionUID field of type long
这两者之间有什么区别。为什么后者会创建一个新的可序列化的类?ArrayList <>()和ArrayList <>(){}之间的区别
new ArrayList<Clazz>()
创建一个新的空ArrayList
Eclipse中显示:The serializable class does not declare a static final serialVersionUID field of type long
在第一个例子,你创建一个ArrayList
实例。在后者中,您正在创建ArrayList
的匿名子类的实例。通常你会覆盖子类中的一个或多个方法,
,否则创建这样的方法没有多大意义。
正如John Skeet指出的那样,创建一个通用类型的匿名子类有一个原因,参见his answer。
Eclipse的警告,为了坚持Serializable
规格(ArrayList
是Serializable
,所以它的所有子类都太),你应该定义在子类中的独特serialVersionUID
从反序列化过程可以保证类定义自序列化以来并没有明显改变(很明显,您自己已决定新定义与旧定义不兼容,因此您可以通过更改serialVersionUID
来表达这一事实)。如果你永远不会序列化这个列表,那么这个警告并不重要。
正如Joonas所说,在第二个例子中,你正在创建一个匿名的内部类。然而,是的一个理由,即使你没有重写任何方法等等:它允许你在执行时确定ArrayList
的元素类型 - 因为匿名内部类的超类是ArrayList<Clazz>
而不仅仅是ArrayList
。
这是类型文字在Guice中的工作方式。这是一个丑陋的黑客,但它完成了工作...
它如何让他在运行时确定元素类型? –
@LouisRhys:如果你在实例上调用'getClass()',它会给出匿名类。如果您然后调用'getGenericSuperclass()''Type'将会有适当的信息。 –
匿名子类。为什么我如此盲目...... –