méthodes d'usine pour les implémentations de Java interfaces enveloppées avec implicits Scala?
Question
J'utilise Scala implicits pour définir une enveloppe riche pour une interface Java:
class RichThing { def richStuff: Unit = {} }
Dans l'objet compagnon, je la conversion implicite définir et une méthode de fabrication 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 de l'utiliser comme un RichThing
(en raison de la conversion implicite):
new JavaThingImpl().richStuff
Je peux aussi créer un en utilisant la méthode <=> usine (en raison de la méthode <=>):
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 l'implémentation Java:
object JavaThingImpl { def apply() = new RichThing() }
Mais le point serait de faire ce travail pour tout (en particulier inconnu) la mise en œuvre de l'interface.
Est-il possible de réaliser cela? Par exemple, pour créer des objets compagnon Scala pour les implémentations Java à la volée, basée sur la conversion implicite dans l'objet <=>?
Ou pour créer l'objet compagnon Scala du côté Java, peut-être dans une classe abstraite?
La solution
Non, cela est impossible à Scala. Il serait sans doute possible de l'ajouter à la langue sans compromettre la solidité du type, mais je me demande si la complexité supplémentaire serait la peine.