Sto scrivendo una classe che funge da classe base per una serie di oggetti singleton. In ogni oggetto singleton, ci saranno vals che rappresentano determinate proprietà, e voglio scrivere un metodo che, per ciascun oggetto singleton, accetta solo oggetti creati da esso.Come utilizzare i tipi di oggetti Singleton di Scala?
così ho il seguente:
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]) = {...}
}
Fin qui, tutto bene. Poi voglio dichiarare uno di questi oggetti Singleton:
object M extends Maker {
val a = make
}
Ma allora, se provo questo:
M.accept(M.a)
allora ottengo un errore di compilazione:
type mismatch; found : com.test.Obj[object com.test.M] required: com.test.Obj[com.test.M.type]
mio domande:
- Qual è il tipo
object com.test.M
e in che modo è diverso dacom.test.M.type
? - Come posso farlo in un modo più intelligente?
per il punto 2: c'è sempre la possibilità di fare 'Obj' una classe annidata di' Maker' e di togliere il parametro di tipo, ma non voglio questo, dato che ho bisogno di passare le istanze di Obj agli oggetti esterni alle classi nel mio esempio e ho bisogno di filtrare sul parametro type. –
Potresti fornire un esempio _compilable? Qualcosa che posso copiare e incollare in un REPL? –
Bellissima domanda: ho riscontrato lo stesso problema quando implementavo una lista HList e il tipo di HNil è stato inferito come ** oggetto HNil ** e non ** HNil.type **. Aggiornato a 2.9 nightly build e ora va tutto bene. – raichoo