匿名初始化 - 奇怪的序列化警告

时间:2011-10-25 19:31:20

标签: java initialization anonymous-types

我想知道为什么当我使用匿名实例和实例初始化块时,我得到一个“可序列化类不会声明类型为long的静态最终serialVersionUID字段”编译时警告。

这就是我的意思。假设我想实例化一个ArrayList,同时为它添加一些东西:

ArrayList<Object> arrayList = new ArrayList<Object>(){{add(new Object());}}; 

如果我编译这一切都没问题,但我得到了serialVersionUID字段缺失警告。现在ArrayList已经实现了serializable并且有一个private static final long serialVersionUID那么为什么当我使用它时,似乎该字段“消失”并且我收到警告没有声明它?

3 个答案:

答案 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,因为它是静态,它也不会被您的匿名子类继承。所以它缺少那个领域。