métodos de fábrica para implementaciones de Java Interfaces envueltos con implícitos Scala?

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

Pregunta

Estoy usando Scala implícitos para definir una envoltura rica para una interfaz Java:

class RichThing { def richStuff: Unit = {} }

En el objeto compañero defino la conversión implícita y un método de fábrica apply:

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

Con esto, puedo crear una instancia de una implementación Java de la interfaz y utilizarlo como un RichThing (debido a la conversión implícita):

new JavaThingImpl().richStuff

También puedo crear un <=> utilizando el método de fábrica (debido al método <=>):

val a = RichThing()

Lo que me gustaría hacer es crear una instancia implementaciones Java arbitrarias de la interfaz de la misma manera. Esto no funciona, como se ve a continuación Scala para un objeto acompañante de la aplicación y no puede encontrar uno:

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

Podría crear un objeto acompañante Scala para la implementación de Java:

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

Sin embargo, el punto sería hacer este trabajo para cualquier (en particular, desconocido) implementación de la interfaz.

¿Hay alguna manera de darse cuenta de esto? Por ejemplo, para crear objetos Scala compañero para las implementaciones de Java sobre la marcha, en base a la conversión implícita en el <=> objeto?

O para crear el objeto compañero Scala desde el lado de Java, tal vez en una clase abstracta?

¿Fue útil?

Solución

No, esto no es posible en Scala. Probablemente sería posible añadirlo a la lengua sin comprometer la solidez tipo, pero la pregunta de si la complejidad adicional sería la pena.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top