6

我正在使用 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"

我可以为 Java 实现创建一个 Scala 伴随对象:

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

但关键是要使该接​​口适用于任何(特别是未知的)实现。

有没有办法实现这一点?例如,基于对象中的隐式转换为 Java 实现动态创建 Scala 伴生RichThing对象?

或者从 Java 端创建 Scala 伴生对象,也许在抽象类中?

4

1 回答 1

3

不,这在 Scala 中是不可能的。可能可以将它添加到语言中而不会影响类型的健全性,但我质疑额外的复杂性是否值得。

于 2009-02-05T19:15:55.970 回答