Estoy escribiendo una clase que sirve como clase base para una serie de objetos singleton. En cada objeto singleton, habrá vals que representen ciertas propiedades, y deseo escribir un método que, para cada objeto singleton, solo acepte objetos creados por él.¿Cómo usar los tipos de objeto singleton de Scala?
Así que tienen la siguiente:
class Obj[M <: Maker]
class Maker {
implicit val me: this.type = this
def make[M <: Maker](implicit maker: M) = new Obj[M]
def accept(obj: Obj[this.type]) = {...}
}
Hasta ahora, todo bien. Entonces quiero declarar una de estas simples objetos:
object M extends Maker {
val a = make
}
Pero entonces, si intento esto:
M.accept(M.a)
entonces consigo un error en tiempo de compilación:
type mismatch; found : com.test.Obj[object com.test.M] required: com.test.Obj[com.test.M.type]
Mi preguntas:
- ¿Cuál es el tipo
object com.test.M
, y ¿cómo es diferente decom.test.M.type
? - ¿Cómo puedo hacer esto de una manera más inteligente?
para el punto 2: siempre existe la posibilidad de hacer 'Obj' una clase anidada de' Maker' y para eliminar el parámetro de tipo, pero no quiero eso, dado que necesito pasar las instancias de Obj a objetos fuera de las clases en mi ejemplo y necesito filtrar el parámetro de tipo. –
¿Podría proporcionar un ejemplo _compilable_? Algo que puedo copiar y pegar en un REPL? –
Gran pregunta: me encontré con el mismo problema al implementar una HList y el tipo de HNil se infirió como ** objeto HNil ** y no ** HNil.type **. Actualizado a 2.9 build nocturno y todo está bien ahora. – raichoo