我在Scala中有一个带有一些标记特征的层次结构。在层次结构的顶部,我将根特征声明为Serializable。几层下来,当我到达具体对象时,特性的继承者似乎忘记了它们是Serializable。层次结构如下所示:
trait DataModel extends Serializable // Marker trait
trait StaticModel extends DataModel // Marker trait
trait RectangleModel[T] extends StaticModel { // Trait with type param
def rows: Int
def columns: Int
def apply(row: Int, column: Int): Option[T]
}
object MakeRectangleModelFromFile { // Factory object
def apply(file: File): RectangleModel[String] =
new RectangleModel[String] { // Anonymous class that
def rows = 2 // implements the trait.
def columns = 3
def apply(row:Int, column:Int): Option[String] = Some("One")
}
}
val x = MakeRectangleModelFromFile(null) // Make object using factory.
println(x.isInstanceOf[Serializable]) // Object should be Serializable!
当我从命令行(Scala 2.10.3)编译并运行时,最后一个语句按预期打印出“true”。当我使用Scala IDE for Eclipse从Eclipse执行相同的操作,以及由SBT 0.13创建的项目时,我得到“false”。具体的数据模型似乎忘记了它是Serializable。如果我提醒它它是Serializable,通过如下构造它:
new RectangleModel[String] with Serializable {
...
}
一切都很好!我想知道SBT缓存中是否有可疑的东西,可能与特征是通用的。我用RectangleModel的一个命名子类生成了一个类似的例子,所以我不认为这个类是匿名的。
当我第一次编写RectangleModel [T]特征时,我忘了将它扩展为StaticModel,因此有一段时间编译器正确。但现在似乎编译器正在记住之前的时间。即使我在Scaladoc这个东西,Scaladoc显示RectangleModel是Serializable。
有关如何清除旧的,不良记忆的任何线索?