Während ich meinen Kopf über another question knackte, stieß ich auf verschiedene Rätsel, die verwandt scheinen. Dies ist einer von ihnen:Darstellungsart kann nicht als Typ Member implementiert werden
trait Sys[S <: Sys[S]] {
type Peer <: Sys[Peer]
}
trait Fenced {
type Peer <: Sys[Peer]
}
def makeFence[S <: Sys[S]] = new Fenced { type Peer = S#Peer }
Wo der Fehler ist wie folgt:
error: overriding type Peer in trait Fenced with bounds >: Nothing <: Sys[this.Peer];
type Peer has incompatible type
def makeFence[S <: Sys[S]] = new Fenced { type Peer = S#Peer }
^
Warum? (Auch versucht, sich selbst Typ _:S =>
-Sys
hinzufügen, spielte keine Rolle)
Während Rex Antwort es möglich macht, das Fenced
Objekt zu konstruieren, ist es nicht wirklich um die Probleme zu lösen ich mit der Darstellungsart Charakter haben bei Verwendung einer Typprojektion verloren gehen (S#Peer
). Ich habe ein anderes Szenario entwickelt, das härtere Bedingungen mit sich bringt. Ich denke, dies ist die Kernfrage ist:
trait Test[S <: Sys[S]] {
def make[T <: Sys[T]](): Unit
make[S#Peer]()
}
error: type arguments [S#Peer] do not conform to method make's type
parameter bounds [T <: Sys[T]]
make[S#Peer]()
^
Ich denke, dass das grundlegende Problem 'Merkmal A [B <: Sys [B]]' (das ist in Ordnung) gegen 'Merkmal A {Typ B <: Sys [B]}' (das scheint der Ursprung von alles Ärger). Aber ich muss wirklich mit Typmitgliedern arbeiten, ich kann in meinem Fall keine Typparameter eingeben. –
Was versuchst du zu erreichen? 'S # Peer' ist das' Peer' von 'S', aber' Fenced' will, dass der Peer _its_ 'Peer' und nicht' S's ist, was die Inkompatibilität auf der Oberfläche erzeugt. Ob es logisch inkompatibel ist oder nicht, hängt davon ab, ob Sie Typen als einfache Aliase oder Besitzübersichten betrachten. Scala ist leider nicht ganz konsequent. Willst du nur sagen: "' Fenced' hat einen Typ, der ein 'Sys' ist? –
@RexKerr - Entschuldigung, wenn die Absicht nicht klar war. Die verknüpften Fragen geben den gesamten Zusammenhang wieder. Grundsätzlich, was ich (glaube ich) brauche, ist, zwei verknüpfte Systeme zu definieren, von denen das eine vom anderen bezeichnet wird, so dass ich das äußere System umgehen kann, ohne zusätzliche Informationen außer "S": Sys [S] 'und in der Lage sein, das andere Peer-System vollständig einzubetten, indem nur Typ-Mitglieder des äußeren Systems verwendet werden. Ich stoße hier irgendwie an die Grenzen der Typ-Projektionen. Die Frage versucht dies zu veranschaulichen, indem es sagt, dass es unmöglich scheint, den Peer-Typ innerhalb eines Konsumenten des äußeren Systems wiederzubeleben. –