Ваша проблема в том, что, хотя свидетельство формы A <:< B
подразумевает, что значение типа A
может быть преобразовано в значение типа B
, оно не подразумевает A <: B
... действительно,Основная причина использования ограничения типа или представления, а не ограничения обычного типа, заключается именно в том, что такое отношение подтипа не выполняется.
Следовательно, ограничение в StateY
, Repr <:< State[Repr]
не являетсядостаточно, чтобы удовлетворить оценку Repr <: State[Repr]
для Observer
'apply
метода.Учитывая, что вы хотите ослабить ограничение на параметр типа StateX
, ваша единственная возможность - ослабить ограничение на параметр типа метода apply
соответственно.Это дает вам что-то вроде следующего, используя ограничение вида вместо обычного ограничения типа
object Observer {
def apply[Repr <% State[Repr]](reader : Reader[Repr]) : Observer[Repr] =
new Observer[Repr] {}
}
или, альтернативно,
object Observer {
def apply[Repr](reader : Reader[Repr])
(implicit ev : Repr <:< State[Repr]) : Observer[Repr] =
new Observer[Repr] {}
}
, если вы предпочитаете использовать ограничения повсюду.*