J'ai réfléchi à un problème de conception dans une bibliothèque sur laquelle je travaille et j'ai réalisé que l'utilisation de types existentiels peut me permettre de modifier mon design de manière à simplifier de nombreuses parties de ma bibliothèque . Cependant, je n'arrive pas vraiment à le faire fonctionner.Type existentiel de Kind-Kinded
Il me semble que myBuilder
est conforme au type MultiSignalBuilder[E, R] forSome { type E[+X] >: Element[X] }
, où Element[X]
est MultiSignalElement[X]
, mais le compilateur dit qu'il does't. Il semble devoir faire le fait que E est un type plus élevé. Pourquoi cela ne fonctionne-t-il pas, et y a-t-il un moyen de le réparer?
class MultiSignalElement[+T] {
}
abstract class MultiSignal[+T] {
type Element[+X] <: MultiSignalElement[X]
val element : Element[T]
def transform[R[+X] <: MultiSignal[X]](builder : MultiSignalBuilder[E, R] forSome { type E[+X] >: Element[X] }) : R[T] =
builder.buildNew(element)
}
abstract class MultiSignalBuilder[-E[+X] <: MultiSignalElement[X], +R[+X] <: MultiSignal[X]] {
def buildNew[T](element : E[T]) : R[T]
}
object myBuilder extends MultiSignalBuilder[MultiSignalElement, MultiSignal] {
def buildNew[T](e : MultiSignalElement[T]) = new MultiSignal[T]() {
type Element[+X] = MultiSignalElement[X]
val element = e
}
}
val multiSignal = new MultiSignal[Int] {
type Element[+X] = MultiSignalElement[X]
val element = new MultiSignalElement()
}
multiSignal.transform(myBuilder) //type error on this line
multiSignal.transform[MultiSignal](myBuilder) //type error on this line
En fait je ne pouvais toujours pas compiler une version existential-less avec scala 2.11.7 – Odomontois
Pourriez-vous donner plus de détails sur la motivation derrière ce morceau de code? Qu'est-ce qu'il est censé accomplir exactement? Corriger les erreurs de compilation sans comprendre la signification du code est assez difficile ... –
@Odomontois, Ouais, on dirait qu'il a compilé. Mais, en fait, les erreurs de compilation étaient juste préemptées par d'autres erreurs dans le projet dans d'autres fichiers. Donc, je l'ai enlevé. – Nimrand