Я использую 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, возможно, в абстрактном классе?