微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐