2009-02-05 11 views
6

estoy usando Scala implícitos para definir una rica envoltura para una interfaz Java:¿Métodos de fábrica para implementaciones de interfaces Java envueltas con implicitos de Scala?

class RichThing { def richStuff: Unit = {} } 

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

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 puede crear un RichThing utilizando el método de fábrica (debido al método apply):

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" 

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

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

Pero el punto sería hacer que esto funcione para cualquier implementación (en particular desconocida) de la interfaz.

¿Hay alguna forma de darse cuenta de esto? Por ejemplo, para crear objetos complementarios de Scala para las implementaciones de Java sobre la marcha, en función de la conversión implícita en el objeto RichThing?

¿O para crear el objeto complementario de Scala desde el lado de Java, tal vez en una clase abstracta?

Respuesta

3

No, esto no es posible en Scala. Probablemente sería posible agregarlo al lenguaje sin comprometer la solidez del tipo, pero me pregunto si la complejidad adicional valdría la pena.

Cuestiones relacionadas