Quiero relajar las restricciones en un parámetro de tipo de rasgo y en su lugar imponerlas en un método en forma de un parámetro de evidencia. Teniendo en cuenta algún tipo de configuración esquelética:Intercambio del límite superior de un parámetro de tipo para un parámetro de evidencia
trait State[Repr]
object Observer {
def apply[Repr <: State[Repr]](reader: Reader[Repr]): Observer[Repr] =
new Observer[Repr] {}
}
trait Observer[A]
trait Reader [A]
Esto funciona:
trait StateX[Repr <: StateX[Repr]] extends State[Repr] {
protected def reader: Reader[Repr]
def observe: Observer[Repr] = Observer(reader)
}
Y esto no es así:
trait StateY[Repr] extends State[Repr] {
protected def reader: Reader[Repr]
def observe(implicit ev: Repr <:< State[Repr]): Observer[Repr] = Observer(reader)
}
Con "inferred type arguments [Repr] do not conform to method apply's type parameter bounds [Repr <: State[Repr]]"
mensaje. Dado que la evidencia ev
sugiere esta conformación, me pregunto cómo se puede reparar StateY
.