基本上,我正在尝试执行以下操作:
trait Foo[T] extends T {
def json: Writes[T]
def bar: String = {
Json.toJson[T](this)(json).toString
}
}
我希望编译器强制使用trait Foo的任何类都是T类。不幸的是,'扩展T'无效。现在,我能做的最好的事情如下:
trait Foo[T] extends T {
def json: Writes[T]
def bar: String = {
Json.toJson(this.asInstanceOf[T])(json).toString
}
}
但显然,编译器并没有强制执行任何操作。无论如何要实现我的目标吗?
答案 0 :(得分:5)
您可以使用self type要求任何扩展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
}
您可以使用您想要的任何名称来代替self
(这只是一个常见的惯例)。