Mentre mi si spezza la testa su another question, mi sono imbattuto in enigmi diversi che sembrano correlati. Questo è uno di loro:Impossibile implementare il tipo di rappresentazione come membro del tipo
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 }
dove l'errore è la seguente:
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 }
^
Perché? (Cercato anche di aggiungere auto-tipo _:S =>
-Sys
, non importa)
Mentre la risposta di Rex permette di costruire l'oggetto Fenced
, in realtà non risolve i problemi che ho con il carattere tipo di rappresentazione perdersi quando si utilizza un tipo di proiezione (S#Peer
). Ho trovato un altro scenario che pone vincoli più difficili; Credo che questo sia il problema centrale:
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]()
^
Sto pensando che il problema fondamentale sia 'tratto A [B <: Sys [B]]' (che va bene) rispetto a 'tratto A {tipo B <: Sys [B]}' (che sembra l'origine di tutti i problemi). Ma ho davvero bisogno di lavorare con i membri dei tipi, non posso introdurre i parametri di tipo nel mio caso. –
Cosa stai cercando di realizzare? 'S # Peer' è quel' Peer' di 'S', ma' Fenced' vuole che il peer sia _its_ 'Peer' non' S', che genera l'incompatibilità (a livello di superficie). Indipendentemente dal fatto che sia logicamente incompatibile, credo dipenda dal fatto che si vedano i tipi come semplici alias o dichiarazioni di proprietà. Scala non è del tutto coerente su questo, sfortunatamente. Stai semplicemente cercando di dire "' Recintato "ha un tipo che è un" Sys' "? –
@RexKerr - scusa se l'intenzione non era chiara. Le domande collegate danno l'intero contesto. Fondamentalmente, quello di cui (penso di) ho bisogno è di definire due sistemi collegati, uno a cui si fa riferimento l'altro, in un modo che mi permetta di aggirare il sistema esterno, senza ulteriori informazioni oltre a 'S <: Sys [S] 'ed essere in grado di incorporare completamente l'altro sistema peer, usando solo i membri di tipo del sistema esterno. In questo caso, sto arrivando a superare i limiti delle proiezioni di tipo. La domanda cerca di illustrare ciò dicendo che sembra impossibile resuscitare il tipo di peer all'interno di un consumatore del sistema esterno. –