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

Shi*_*gon 5 java initialization anonymous-types

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

这就是我的意思.假设我想实例化一个ArrayList,同时向它添加一些内容,如下所示:

ArrayList<Object> arrayList = new ArrayList<Object>(){{add(new Object());}}; 
Run Code Online (Sandbox Code Playgroud)

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

Jac*_*nds 8

创建匿名类时,实际上是在扩展ArrayList,因此继承了该Serializable接口.

所有Serializable类都应该有一个,serialVersionUID以便您可以区分类的不同序列化版本.由于匿名类型是一个新类,因此给它一个ID是个好主意,这样你就可以区分它的不同版本.

  • 得到它,所以这就像扩展ArrayList类,然后扩展类具有初始化块,调用"add"但它是一个不同的类,它需要它自己的serialVersionUID(因为它从ArrayList继承Serializable).这对我来说并不明显,因为我正在创建一个匿名类. (3认同)
  • @AndreiBodnarescu准确地说.说完了,不鼓励使用这种双括号语法进行集合启动,因为现在你没有真正的ArrayList,而是一些模糊的子类,这可能会在以后引起模糊的问题.可能没有太多机会遇到这些问题,但是当你这样做时,它将成为一名头脑风暴者.它可能很冗长,但你最好只编写所有`add()`语句或初始化一个数组,然后用它创建列表. (2认同)