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