2009-02-05 60 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

不,這在斯卡拉是不可能的。可能將其添加到語言中而不影響類型的健全性,但是我質疑額外的複雜性是否值得。