Замена верхней границы параметра типа на параметр доказательства

Я хочу ослабить ограничения на параметр типа трейта и вместо этого наложить их на метод в виде параметра доказательства. Учитывая некоторую скелетную установку:

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.

6
задан Qantas 94 Heavy 1 May 2014 в 09:08
поделиться