méthodes d'usine pour les implémentations de Java interfaces enveloppées avec implicits Scala?

StackOverflow https://stackoverflow.com/questions/514428

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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top