使用泛型实现Scala特征的类型

Ric*_*rtz 3 generics scala traits

基本上,我正在尝试执行以下操作:

trait Foo[T] extends T {
  def json: Writes[T]
  def bar: String = {
    Json.toJson[T](this)(json).toString
  }
}
Run Code Online (Sandbox Code Playgroud)

我希望编译器强制使用trait Foo的任何类都是T类.不幸的是,'extends T'无效.现在,我能做的最好的事情如下:

trait Foo[T] extends T {
  def json: Writes[T]
  def bar: String = {
    Json.toJson(this.asInstanceOf[T])(json).toString
  }
}
Run Code Online (Sandbox Code Playgroud)

但显然,编译器没有强制执行任何操作.反正有没有实现我想要的?

Tra*_*own 5

您可以使用self类型来要求任何扩展的类Foo[T]也是以下的实例T:

import play.api.libs.json._

trait Foo[T] { self: T =>
  def json: Writes[T]
  def bar: String = Json.toJson[T](self)(json).toString
}
Run Code Online (Sandbox Code Playgroud)

您可以使用您想要的任何名称代替self(这只是一个常见的约定).