我正在尝试创建一个通用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
答案 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
的类型。