2011-07-07 18 views
2

我有一個Scala的性狀值foo在Java類和Scala性狀不兼容的類型的混合

trait MyTrait{ 
    val foo: String 
    def bar = foo 
} 

和提供FOO

public class MyJavaClass { 
    public final String foo = "hello"; 
} 
一個Java類

現在我試着將它們混合

class MyScalaClass extends MyJavaClass with MyTrait { 
} 

它不會編譯

overriding value foo in trait MyTrait of type String; value foo in class MyJavaClass of type java.lang.String has incompatible type. 

我已經嘗試了vals,vars和defs的所有看起來似乎合理的組合,但找不到任何編譯此配置的方法。

如何提供一個Java類的trait val?

+0

你可以改變Java類嗎? –

+0

我可以改變Java類 - 提供一個getter,但我寧願理解字段不工作的原因。 –

回答

5

我認爲這是由於斯卡拉生成「公共」變量的getter和setter的事實 - 變量本身始終是私有的,但scalac使它們看起來好像他們是公開訪問。

換句話說,我相信你的val foo: String聲明的特徵其實就相當於:

// def foo_=(s: String) // setter - would apply to var declarations 
def foo: String  // getter 

所以你需要提供執行的foo方法,而不是露出了一個Java類公衆變量

+0

謝謝,這是有道理的,所以我想答案是我不能使用Java字段來提供val。 –

+0

@Duncan我相信這是一個準確的評估,是的。 –