我想知道为什么当我使用匿名实例和实例初始化块时,我得到一个“可序列化类不会声明类型为long的静态最终serialVersionUID字段”编译时警告。
这就是我的意思。假设我想实例化一个ArrayList,同时为它添加一些东西:
ArrayList<Object> arrayList = new ArrayList<Object>(){{add(new Object());}};
如果我编译这一切都没问题,但我得到了serialVersionUID字段缺失警告。现在ArrayList已经实现了serializable并且有一个private static final long serialVersionUID
那么为什么当我使用它时,似乎该字段“消失”并且我收到警告没有声明它?
答案 0 :(得分:8)
创建匿名类时,实际上是在扩展ArrayList
,因此继承了Serializable
接口。
所有Serializable
类都应该有serialVersionUID
,以便您可以区分不同类的序列化版本。由于匿名类型是一个新类,因此最好给它一个ID,以便区分它的不同版本。
答案 1 :(得分:2)
因为你创造的本质上是一个子类。这样的子类需要它自己的串行版本UID。当你继承像JPanel这样的东西时也会发生同样的事情。如果您不需要(反)序列化,这不是一个可怕的问题。
答案 2 :(得分:1)
new ArrayList<Object>() {
{
add(new Object());
}
};
您不只是实例化,而是首先定义ArrayList
的子类(匿名),然后实例化子类。
即使private static final long serialVersionUID
中有ArrayList
,因为它是静态,它也不会被您的匿名子类继承。所以它缺少那个领域。