Factory-Methoden für Implementierungen von Java-Schnittstellen mit Scala implicits eingewickelt?
Frage
Ich bin mit Scala implicits eine reiche Wrapper für eine Java-Schnittstelle zu definieren:
class RichThing { def richStuff: Unit = {} }
Im Begleitobjekt definiere ich die implizite Konvertierung und eine apply
Factory-Methode:
object RichThing {
implicit def rich( thing: JavaThing ) = new RichThing()
def apply() = new RichThing()
}
Damit kann ich eine Java-Implementierung der Schnittstelle instanziieren und verwenden Sie es wie ein RichThing
(aufgrund der impliziten Konvertierung):
new JavaThingImpl().richStuff
Ich kann auch eine RichThing
schaffen die Factory-Methode (aufgrund der apply
-Methode):
val a = RichThing()
Was Ich mag würde zu tun ist, beliebige Java-Implementierungen der Schnittstelle in der gleichen Art und Weise instanziiert. Das funktioniert nicht, wie Scala dann für ein Begleitobjekt der Umsetzung sieht und nicht finden können:
val b = JavaThingImpl() // "not found: value JavaThingImpl"
Ich könnte ein Scala Begleiter-Objekt für die Java-Implementierung erstellen:
object JavaThingImpl { def apply() = new RichThing() }
Aber der Punkt wäre diese Arbeit für alle zu machen (insbesondere unbekannt) Implementierung der Schnittstelle.
Gibt es eine Möglichkeit, dies zu realisieren? Zum Beispiel Scala Begleiter Objekte für die Java-Implementierungen auf der Fliege, auf der Grundlage der impliziten Umwandlung im RichThing
Objekt zu erstellen?
oder das Scala Begleiter Objekt aus der Java-Seite zu erstellen, vielleicht in einer abstrakten Klasse?
Lösung
Nein, das ist in Scala nicht möglich. Es wäre wahrscheinlich möglich sein, ohne Kompromisse bei Typ Solidität der Sprache zu schreiben, aber ich Frage, ob die zusätzliche Komplexität es sich lohnen würde.