使用SBT / Eclipse在Scala中不会出现可序列化特征

时间:2014-02-01 05:05:49

标签: eclipse scala serialization sbt

我在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。

有关如何清除旧的,不良记忆的任何线索?

0 个答案:

没有答案