Piszę klasy, która służy jako klasa bazowa dla serii obiektów singleton. W każdym obiekcie singleton będą vals reprezentujące pewne właściwości i chcę napisać metodę, która dla każdego obiektu singleton akceptuje tylko obiekty przez nią utworzone.Jak korzystać z typów singleton-object Scala?
Więc mam następujące:
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]) = {...}
}
Tak daleko, tak dobrze. Następnie chcę zadeklarować jeden z tych pojedynczych obiektów:
object M extends Maker {
val a = make
}
ale wtedy, gdy próbuję to:
M.accept(M.a)
następnie pojawia się błąd kompilacji:
type mismatch; found : com.test.Obj[object com.test.M] required: com.test.Obj[com.test.M.type]
My pytania:
- Jaki jest typ
object com.test.M
i czym się różni odcom.test.M.type
? - Jak mogę to zrobić w bardziej inteligentny sposób?
do punktu 2: zawsze istnieje możliwość, aby 'Obj' zagnieżdżona klasa' Maker' i usunąć parametr typu, ale nie chcę tak, ponieważ muszę przekazać instancje Obj do obiektów spoza klas w moim przykładzie i muszę filtrować na parametrze type. –
Czy możesz podać przykład _compilable_? Coś, co mogę skopiować i wkleić do REPL? –
Świetne pytanie: wpadłem na ten sam problem podczas implementacji HList, a typ HNil został wywnioskowany jako ** obiekt HNil **, a nie ** HNil.type **. Ulepszony do wersji 2.9 nightly i wszystko jest już w porządku. – raichoo