我使用的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实现以同样的方式。这不起作用,因为斯卡拉然后查找实施的同伴对象,不能找到一个:

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

我可以为Java实现创建Scala的同伴对象:

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

但重点将是使任何这项工作(尤其是未知)接口的实现。

有什么办法来实现这一点?例如,创建在运行中的Java实现斯卡拉同伴对象,基于RichThing对象的隐式转换?

或者创建从Java侧Scala的同伴对象,也许在一个抽象类?

有帮助吗?

解决方案

没有,这是不可能的Scala中。或许,这将有可能将其添加到语言又不损害型稳健,但我质疑额外的复杂性是否将是值得的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top