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

时间:2015-09-21 18:35:57

标签: scala generics traits

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

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
  }
}

但显然,编译器并没有强制执行任何操作。无论如何要实现我的目标吗?

1 个答案:

答案 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(这只是一个常见的惯例)。