2009-02-05 6 views
6

I Scala bin mit implicits eine reiche Wrapper für eine Java-Schnittstelle zu definieren:Factory-Methoden für die Implementierung von Java-Schnittstellen mit Scala implicits?

class RichThing { def richStuff: Unit = {} } 

Im Begleitobjekt mir die implizite Konvertierung und eine apply Factory-Methode zu definieren:

object RichThing { 
    implicit def rich(thing: JavaThing) = new RichThing() 
    def apply() = new RichThing() 
} 

Damit ich kann eine Java-Implementierung der Schnittstelle instanziieren und verwenden sie es wie ein RichThing (aufgrund der impliziten Konvertierung):

new JavaThingImpl().richStuff 

Ich kann auch erstellen RichThing die Factory-Methode unter Verwendung von (aufgrund der apply-Methode):

val a = RichThing() 

Was ich möchte, ist frei wählbar Java-Implementierungen der Schnittstelle in der gleichen Art und Weise zu tun, instanziiert. Das funktioniert nicht, wie Scala dann für ein Begleitobjekt der Umsetzung sieht und nicht finden kann:

val b = JavaThingImpl() // "not found: value JavaThingImpl" 

ich ein Scala Begleiter-Objekt für die Java-Implementierung schaffen könnte:

object JavaThingImpl { def apply() = new RichThing() } 

Aber der Punkt wäre, dass dies für jede (insbesondere unbekannte) Implementierung der Schnittstelle funktioniert.

Gibt es eine Möglichkeit, dies zu realisieren? Zum Beispiel, um Scala Companion-Objekte für die Java-Implementierungen im laufenden Betrieb zu erstellen, basierend auf der impliziten Konvertierung im RichThing Objekt?

Oder das Scala Companion-Objekt von der Java-Seite, vielleicht in einer abstrakten Klasse zu erstellen?

Antwort

3

Nein, das ist in Scala nicht möglich. Es wäre wahrscheinlich möglich, es der Sprache hinzuzufügen, ohne die Typsicherheit zu gefährden, aber ich frage mich, ob sich die zusätzliche Komplexität lohnen würde.

Verwandte Themen