10

我想下面这段代码转换从Java到斯卡拉:如何将@SerialVersionUID添加到匿名类?

Foo foo = new Foo() { private static final long serialVersionUID = 12345L; } 

Foo是一个抽象类。

等效代码在Scala中的外观如何?

+0

标题和实际问题如何相关? – 2011-04-05 11:57:19

+0

好吧,我在标题中问我如何将'@ SerialVersionUID'添加到一个匿名类中,并显示一个带有'serialVersionUID'的构造匿名类的示例,该类展示了所述问题。 – soc 2011-04-05 12:35:58

回答

10

有一个Scala annotation for adding the ID。但看起来,你不能将这个解决方案应用于匿名内部类。然而,根据Scala FAQ

在这种评估 在编译时 称为恒定Scala的私有值都变成私有静态最后 Java变量。这个无证的 功能应该为你做诀窍。 只需查看Scala中的 列表的实现(请参阅,例如, src/scala/List.java)。两个类:: 和Nil都有以下形式的字段serialVersionUID : private val serialVersionUID =数字字面量;

代码

object Ser extends Application { 
    trait Foo { def xy: Int } 
    val x = new Foo with java.io.Serializable { def xy = 2; private val serialVersionUID = 1L } 
} 

编译罚款与2.8.1编译器。我还没有对它进行测试,但是对于生成的类的序列版本是否实际上是提供的。

+0

Mhh,但是这会将它添加为实例方法,而不是作为类方法,对吗?我不认为这会起作用...... – soc 2011-04-07 18:58:51

+0

@soc:查看摘自常见问题解答的摘录:“在Scala中,在编译时评估为常量的私有值被转换为私有静态最终Java变量。” – Dirk 2011-04-08 11:25:30

+0

WTH?我不知道这一点,从来没有认为会发生......非常感谢!我只是想知道这是否是所需要的,或者是否需要关于serialVersionUID的一些特殊魔法...... – soc 2011-04-08 12:12:15