使用SBT/Eclipse时Scala中不存在可序列化特性
我在Scala中有一个带有一些标记特征的层次结构。在层次结构的顶部,我声明根特征是可序列化的。再往下几层,当我谈到具体对象时,trait的继承者似乎忘记了它们是可序列化的。层次结构如下所示:使用SBT/Eclipse时Scala中不存在可序列化特性,eclipse,scala,serialization,sbt,Eclipse,Scala,Serialization,Sbt,我在Scala中有一个带有一些标记特征的层次结构。在层次结构的顶部,我声明根特征是可序列化的。再往下几层,当我谈到具体对象时,trait的继承者似乎忘记了它们是可序列化的。层次结构如下所示: trait DataModel extends Serializable // Marker trait trait StaticModel extends DataModel // Marker trait trait RectangleModel[T
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”。当我在Eclipse中使用Scala IDE for Eclipse以及由SBT 0.13创建的项目执行相同操作时,我得到“false”。具体的数据模型似乎忘记了它是可序列化的。如果我提醒它是可序列化的,请按如下方式构造它:
new RectangleModel[String] with Serializable {
...
}
一切又好了!我想知道SBT缓存中是否有可疑的东西,可能与该特征是泛型有关。我已经用RectangleModel的一个命名子类生成了一个类似的示例,所以我认为这个类是匿名的并没有问题
当我第一次编写RectangleModel[T]trait时,我忘了让它扩展StaticModel,所以有一段时间编译器是正确的。但现在编译器似乎记住了之前的时间。甚至当我缩放这个东西时,Scaladoc显示矩形模型是可序列化的
关于如何清除这些旧的、坏的内存,有什么线索吗?您是否尝试过“sbt clean”?您是否介意在GitHub上共享代码,以便开始项目并修复它所需的一切都是克隆它?您是否尝试过sbt clean。还试图篡改代码,以使其强制重新编译。将尝试将代码获取到GitHub。