2009-02-05 7 views
6

J'utilise Scala implicits pour définir une enveloppe riche pour une interface Java:Méthodes d'usine pour les implémentations d'interfaces Java enveloppées avec Scala implicits?

class RichThing { def richStuff: Unit = {} } 

Dans l'objet compagnon, je définir la conversion implicite et une méthode d'usine apply:

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

Avec cela, Je peux instancier une implémentation Java de l'interface et l'utiliser comme une RichThing (en raison de la conversion implicite):

new JavaThingImpl().richStuff 

Je peux aussi créer un RichThing en utilisant la méthode de l'usine (en raison de la méthode apply):

val a = RichThing() 

Ce que je voudrais faire est instancier implémentations Java arbitraires de l'interface de la même manière. Cela ne fonctionne pas, comme Scala cherche alors un objet compagnon de la mise en œuvre et ne peut pas trouver un:

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

Je pourrais créer un objet compagnon Scala pour la mise en œuvre Java:

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

Mais le point serait de faire fonctionner ceci pour n'importe quelle implémentation (en particulier inconnue) de l'interface.

Y at-il un moyen de réaliser cela? Par exemple, créer des objets compagnons Scala pour les implémentations Java à la volée, en fonction de la conversion implicite dans l'objet RichThing?

Ou de créer l'objet compagnon Scala du côté Java, peut-être dans une classe abstraite?

Répondre

3

Non, ce n'est pas possible dans Scala. Il serait probablement possible de l'ajouter à la langue sans compromettre la solidité du type, mais je me demande si la complexité supplémentaire en vaudrait la peine.

Questions connexes