Фабричные методы для реализаций интерфейсов Java, обернутых имплицитами Scala?
Вопрос
Я использую 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 это невозможно.Вероятно, было бы возможно добавить это в язык без ущерба для надежности типа, но я сомневаюсь, что дополнительная сложность того стоила бы.