Scala泛型this.type

我试图创建一个通用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,而是基于trait的方法声明的预期返回类型为SomeImpl.this.type,因此无法编译.

有人知道我需要如何更改trait方法声明的返回类型,这样才能正常工作?更通用的用例是通过扩展的通用特征来揭示案例类的复制方法.我知道我可能没有清楚地说明这一点,让我知道我应该澄清什么.

使用Scala 2.10.0

解决方法

您可以通过将混合的类型类型的trait进行参数化来解决它:

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的类型.

相关文章

共收录Twitter的14款开源软件,第1页Twitter的Emoji表情 Tw...
Java和Scala中关于==的区别Java:==比较两个变量本身的值,即...
本篇内容主要讲解“Scala怎么使用”,感兴趣的朋友不妨来看看...
这篇文章主要介绍“Scala是一种什么语言”,在日常操作中,相...
这篇文章主要介绍“Scala Trait怎么使用”,在日常操作中,相...
这篇文章主要介绍“Scala类型检查与模式匹配怎么使用”,在日...