2009-02-05 5 views
6

Я использую Scala implicits определить богатую оболочку для интерфейса Java:Фабричные методы для реализации интерфейсов Java, завернутых в Scala implicits?

class RichThing { def richStuff: Unit = {} } 

В объекте компаньона я определяю неявное преобразование и метод apply фабрики:

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

С этим, Я могу создать экземпляр реализации Java интерфейса и использовать его как RichThing (из-за неявное преобразование):

new JavaThingImpl().richStuff 

Я также могу создать RichThing используя фабричный метод (из-за метода apply):

val a = RichThing() 

То, что я хотел бы сделать, это создать экземпляр произвольных реализаций Java интерфейса таким же образом. Это не работает, так как Scala затем ищет компаньона объекта реализации и не может найти один:

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

я мог бы создать объект Scala компаньон для реализации Java:

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

Но дело в том, чтобы сделать эту работу для любой (в частности, неизвестной) реализации интерфейса.

Есть ли способ реализовать это? Например, для создания объектов-компаньонов Scala для реализаций Java «на лету» на основе неявного преобразования в объекте RichThing?

Или создать объект-компаньон Scala со стороны Java, возможно, в абстрактном классе?

ответ

3

Нет, это невозможно в Скале. Вероятно, можно было бы добавить его на язык, не ставя под угрозу устойчивость типа, но я сомневаюсь в том, что будет стоить дополнительная сложность.