Mientras agrieta mi cabeza sobre another question, me encontré con diferentes acertijos que parecen relacionados. Esta es una de ellas:No se puede implementar el tipo de representación como miembro de 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 }
Cuando el error es el siguiente:
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 }
^
¿Por qué? (También intentó añadir uno mismo tipo _:S =>
a Sys
, no importaba)
Si bien la respuesta de Rex hace que sea posible construir el objeto Fenced
, que en realidad no resuelve los problemas que tengo con el personaje tipo de representación perderse al utilizar una proyección de tipo (S#Peer
). He llegado a otro escenario que plantea restricciones más difíciles; Creo que esta es la raíz del problema:
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]()
^
Estoy pensando que el problema fundamental es 'rasgo A [B <: Sys [B]]' (que está bien) contra 'rasgo A {tipo B <: Sys [B]}' (que parece ser el origen de todos los problemas). Pero realmente necesito trabajar con miembros de tipo, no puedo introducir parámetros de tipo en mi caso. –
¿Qué estás tratando de lograr? 'S # Peer' es ese' Peer' de 'S', pero' Fenced' quiere que el par sea _its_ 'Peer' y no' S''s, lo que genera la incompatibilidad (a nivel de superficie). Si o no es lógicamente incompatible, supongo que depende de si ve los tipos como alias simples o declaraciones de propiedad. Scala no es del todo coherente en esto, desafortunadamente. ¿Estás tratando de decir "' Fenced' tiene un tipo que es 'Sys'"? –
@RexKerr: lo siento si la intención no estaba clara. Las preguntas vinculadas dan el contexto completo. Básicamente, lo que yo (creo que) necesito es definir dos sistemas vinculados, uno referido por el otro, de una manera que me permita pasar alrededor del sistema externo, sin información adicional que no sea 'S <: Sys [S] 'y poder incrustar completamente el otro sistema de pares, usando solo miembros de tipo del sistema externo. Estoy llegando al límite de las proyecciones de tipos aquí. La pregunta trata de ilustrar esto diciendo que parece imposible resucitar el tipo de igual dentro de un consumidor del sistema externo. –