J'écris une classe qui sert de classe de base pour une série d'objets singleton. Dans chaque objet singleton, il y aura des vals représentant certaines propriétés, et je veux écrire une méthode qui, pour chaque objet singleton, n'accepte que des objets créés par lui.Comment utiliser les types d'objets singleton de Scala?
Je donne les résultats suivants:
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]) = {...}
}
Jusqu'à présent, si bon. Ensuite, je veux déclarer un de ces objets singleton:
object M extends Maker {
val a = make
}
Mais, si j'essaie ceci:
M.accept(M.a)
je reçois une erreur de compilation:
type mismatch; found : com.test.Obj[object com.test.M] required: com.test.Obj[com.test.M.type]
Mon questions:
- Quel est le type
object com.test.M
, et comment est-il différent decom.test.M.type
? - Comment puis-je faire cela plus intelligemment?
pour le point 2: il y a toujours la possibilité de faire 'Obj' une classe imbriquée de' Maker' et pour supprimer le paramètre de type, mais je ne veux pas Cela, puisque j'ai besoin de passer des instances Obj aux objets en dehors des classes dans mon exemple et j'ai besoin de filtrer sur le paramètre type. –
Pourriez-vous s'il vous plaît fournir un exemple _compilable_? Quelque chose que je peux copier et coller dans un REPL? –
Grande question: J'ai rencontré le même problème lors de l'implémentation d'un HList et le type de HNil a été déduit comme ** objet HNil ** et non ** HNil.type **. Amélioré à 2.9 nuit de construction et tout va bien maintenant. – raichoo