У меня есть компилятор Тип ошибки несоответствия, что я не понимаю.Тип несоответствие с проекцией типа
Учитывая следующее определение Elem
и завод (Companion
):
object Elem {
trait Companion[E[~] <: Elem[~]] {
def apply[S](peer: E[S]#Peer): E[S] // wrap a peer in its elem
}
}
trait Elem[S] {
type Peer
}
И учитывая, например, в Obj
с атрибутами и тип пэра Expr
:
trait Expr[S, A]
trait Obj[S] {
// query an attribute by key
def attr[E[~] <: Elem[~]](key: String)
(implicit c: Elem.Companion[E]): Option[E[S]#Peer]
}
я должен быть в состоянии чтобы сделать следующее:
// process elements with peer `Expr[~, A]`
trait Impl[S, A, E[~] <: Elem[~] { type Peer = Expr[~, A] }] {
implicit def companion: Elem.Companion[E]
def test(obj: Obj[S]): Unit =
obj.attr[E]("foo").fold(()) { ex =>
val newElem = companion[S](ex)
}
}
Этот последний сбой с сообщением об ошибке: блестящем
<console>:62: error: type mismatch; found : E[S]#Peer (which expands to) Expr[S,A] required: E[S]#Peer (which expands to) Expr[S,A] val newElem = companion[S](ex) ^
Уже видел ту же ошибку в собственном проекте, но, к сожалению, не помню, как исправлено это. –