Применение типа признака Scala с помощью универсального


По существу, я пытаюсь сделать следующее:

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

Я хочу, чтобы компилятор убедился, что любой класс, использующий признак Foo, имеет тип T. к сожалению, "extends T" недопустим. Прямо сейчас, лучшее, что я могу сделать, это следующее:

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

Но очевидно, что компилятор ничего не навязывает. Есть ли вообще возможность достичь того, чего я хочу?

1 3

1 ответ:

Вы можете использовать тип собственной личности требовать, чтобы любой класс, расширяющий 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 (что является просто общим соглашением).