2009-02-05 58 views
6

我使用Scala的implicits定义了丰富的包装器的Java接口:实现用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 

我还可以创建使用工厂方法(由于apply法)RichThing

val a = RichThing() 

我希望做的是实例化界面的任意的Java实现以同样的方式。这不起作用,因为斯卡拉然后查找实施的同伴对象,不能找到一个:

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

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

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

但关键是要使这项工作适用于接口的任何(特别是未知的)实现。

有什么办法可以实现这个吗?例如,基于RichThing对象中的隐式转换,为Java实现即时创建Scala伴随对象?

或者从Java端创建Scala伴侣对象,可能是抽象类?

回答

3

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