这两者之间有什么区别?为什么后者会创建一个新的可序列化类?
new ArrayList<Clazz>()
创建一个新的空 ArrayList
new ArrayList<Clazz>(){}
Eclipse显示:可序列化类没有声明静态的final serialVersionUID 字段,类型为long
这两者之间有什么区别?为什么后者会创建一个新的可序列化类?
new ArrayList<Clazz>()
创建一个新的空 ArrayList
new ArrayList<Clazz>(){}
Eclipse显示:可序列化类没有声明静态的final serialVersionUID 字段,类型为long
ArrayList
实例。在后面的例子中,你创建了一个 ArrayList
的匿名子类实例。通常情况下,你会在子类中覆盖一个或多个方法,否则创建这样的子类就没有太大的意义。正如John Skeet所指出的那样,有一种巧妙的方法可以创建泛型类型的匿名子类,请参见他的回答。Serializable
规范(ArrayList
是可序列化的,因此其所有子类也是可序列化的),你应该在子类中定义一个唯一的 serialVersionUID
,从而使反序列化进程可以确保类定义自被序列化以来没有发生重大改变(重大改变意味着你自己已经确定新定义与旧定义不兼容,所以你可以通过更改 serialVersionUID
来表达这个事实)。如果你永远不打算对列表进行序列化,则该警告无关紧要。ArrayList
的元素类型-因为匿名内部类的超类是ArrayList<Clazz>
而不仅仅是ArrayList
。
getClass()
,它将返回匿名类。然后调用getGenericSuperclass()
方法,该Type
将包含适当的信息。 —— @LouisRhys - Jon Skeet