Scala通用this.type

时间:2013-11-23 17:34:12

标签: scala generics

我正在尝试创建一个通用trait,它有一个返回类本身实例的方法。例如:

trait SomeGenericTrait[T]{
   def withData(newData : Seq[T]) : this.type
}

case class SomeImpl(data : Seq[Int]) extends SomeGenericTrait[Int] {
   override def withData(newData : Seq[Int]) : SomeImpl = copy(data = newData)
}

error: overriding method withData in trait SomeGenericTrait of type(newData: Seq[Int])SomeImpl.this.type; method withData has incompatible type

没有明确的返回类型:

case class SomeImpl(data : Seq[Int]) extends SomeGenericTrait[Int] {
   override def withData(newData : Seq[Int]) = copy(data = newData)
}

error: type mismatch;
 found   : SomeImpl
 required: SomeImpl.this.type

这会导致编译失败,因为已实现的withData的返回值为SomeImpl,但基于特征的方法声明的预期返回类型为SomeImpl.this.type

有没有人知道我需要如何更改特征方法声明的返回类型以便这样做?我使用的更一般的用例是通过它扩展的通用特征公开案例类'copy方法的一种方法。我知道我可能不清楚这一点,让我知道我是否应该澄清任何事情。

使用Scala 2.10.0

1 个答案:

答案 0 :(得分:12)

您可以通过使用要混合的类的类型类型参数化特征来解决它:

trait SomeGenericTrait[T, X] {
  def withData(newData: Seq[T]): X
}

case class SomeImpl(data: Seq[Int]) extends SomeGenericTrait[Int, SomeImpl] {
  override def withData(newData: Seq[Int]): SomeImpl = copy(data = newData)
}

this.type是单例类型 - 一个特定实例化SomeGenericTrait的类型。