Wie verwenden von Scala singleton-Objekt-Typen?

Ich Schreibe eine Klasse dient als Basisklasse für eine Reihe von singleton-Objekten. In jeder singleton-Objekte, es wird vals repräsentieren bestimmte Eigenschaften, und ich will schreiben Sie eine Methode, die für jede singleton-Objekt, akzeptiert nur Objekte, die von ihm erstellt.

Also ich habe Folgendes:

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]) = {...}
}

So weit, So gut. Dann möchte ich erklären, einer dieser singleton-Objekte:

object M extends Maker {
  val a = make
}

Aber dann, wenn ich es versuchen:

M.accept(M.a)

dann bekomme ich einen compile-Zeit-Fehler:

type mismatch; found : com.test.Obj[object com.test.M] required: com.test.Obj[com.test.M.type]

Meine Fragen:

  1. Was ist der Typ object com.test.M, und wie unterscheidet es sich von com.test.M.type?
  2. Wie kann ich dies in einer INTELLIGENTEREN Weg?
  • für Punkt 2: es gibt immer die Möglichkeit, um Obj eine geschachtelte Klasse Maker und entfernen Sie den type-parameter, aber ich möchte das nicht, da muss ich vorbei um Obj-Instanzen auf Objekte außerhalb der Klassen in meinem Beispiel, und ich brauche, um filter auf den Typ-parameter.
  • Könnten Sie bitte geben Sie eine kompilierbare Beispiel? Etwas, was ich kann kopieren&einfügen in eine REPL?
  • Gute Frage: ich lief in das gleiche problem bei der Umsetzung einer HList und die Art der HNil abgeleitet wurde als Objekt HNil und nicht HNil.Typ. Upgrade auf 2.9 nightly-build und alles ist in Ordnung jetzt.
Schreibe einen Kommentar