Я хочу ослабить ограничения на параметр типа трейта и вместо этого наложить их на метод в виде параметра доказательства. Учитывая некоторую скелетную установку:
trait State[Repr]
object Observer {
def apply[Repr <: State[Repr]](reader: Reader[Repr]): Observer[Repr] =
new Observer[Repr] {}
}
trait Observer[A]
trait Reader [A]
Это работает:
trait StateX[Repr <: StateX[Repr]] extends State[Repr] {
protected def reader: Reader[Repr]
def observe: Observer[Repr] = Observer(reader)
}
А это нет:
trait StateY[Repr] extends State[Repr] {
protected def reader: Reader[Repr]
def observe(implicit ev: Repr <:< State[Repr]): Observer[Repr] = Observer(reader)
}
С сообщением "inferred type arguments [Repr] do not conform to method apply's type parameter bounds [Repr <: State[Repr]]"
. Поскольку доказательство ev
предполагает такое соответствие, интересно, как можно исправить StateY
.