Фабричные методы для реализаций интерфейсов Java, обернутых имплицитами Scala? - PullRequest
6 голосов
/ 05 февраля 2009

Я использую импликации Scala для определения расширенной оболочки для интерфейса Java:

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, может быть, в абстрактном классе?

1 Ответ

3 голосов
/ 05 февраля 2009

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

...