如何为匿名类添加@SerialVersionUID?

11

我想将以下Java代码翻译成Scala:

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

Foo类是一个抽象类。

Scala中对应的代码应该是什么样子?


标题和实际问题有什么关联? - Laurent Pireyn
我在标题中询问如何向匿名类添加@SerialVersionUID,并展示一个带有serialVersionUID的构造匿名类的示例,以解答上述问题。 - soc
1个回答

10

有一个Scala注解可用于添加ID。但是看起来,您不能将此解决方案应用于匿名内部类。但是,根据Scala FAQ

  

在Scala中,评估为在编译时已知的常量的私有值会转换为Java的私有静态final变量。 这个未经记录的特性对你应该有所帮助。 只需查看Scala列表的实现(请参见src / scala / List.java)。 ::和Nil两个类都有以下形式的serialVersionUID字段:   private val serialVersionUID = numeric literal;

代码:

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编译器可以成功编译。不过我还没有测试过生成的类的串行版本是否确实是提供的那个版本。


嗯,但这会将其添加为实例方法而不是类方法,对吧?我认为那样行不通... - soc
请参阅常见问题解答中的摘录:“在Scala中,评估为编译时已知常量的私有值将转换为私有静态final Java变量。” - Dirk
什么?我不知道这个,也从未想过会发生这种情况...非常感谢!我只是想知道是否需要一些特殊的魔法来处理 serialVersionUID,或者现在已经足够了... - soc
@soc:我不确定,但我认为它比那更通用:为什么要为编译时已知为常量且在类的所有实例中具有相同值的东西创建实例变量(或:魔术getter或其他)? - Dirk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接