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

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

Вопрос

Я использую Scala implicits для определения расширенной оболочки для интерфейса 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, может быть, в абстрактном классе?

Это было полезно?

Решение

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top