2011-12-08 67 views
8

給定以下的Scala對象:我可以訪問一個沒有Java括號的Scala對象的val嗎?

object ScalaObject { 
    val NAME = "Name" 
} 

似乎Scala編譯器生成一個無參數的方法來訪問NAME字段。然而,當我試圖從Java訪問這個領域,它看起來像進入這個領域唯一的辦法就是像一個無參數方法:

System.out.println(ScalaObject$.MODULE$.NAME()); 

有沒有哄Scala編譯器,以允許Java訪問的方式val每個預期的Java成語如下:

System.out.println(ScalaObject$.MODULE$.NAME); 
+0

小寫vals是否也發生同樣的情況? – ziggystar

+0

順便說一句,這不是預期的* Java *成語,它是預期的* Scala *成語。就字節碼而言,Scala(幾乎?)總是將字段暴露爲具有相同名稱的getter方法。 –

+1

@AndrzejDoyle,我不確定你在說什麼。在Java中,預計會訪問不帶括號的靜態最終字段,因爲它是唯一的方法。你似乎暗示的是,在Scala中,預期的技術是使用getter方法。無論如何,無論是Scala的首選技術,似乎都與恰好在Scala中實現的API的Java客戶端不相關。 –

回答

7

嚴格地說,答案是否定的,因爲scala不是隻生成一個字段,而是一對訪問它的方法。但是,使用@scala.reflect.BeanProperty註釋scala val將生成Java風格的getter和setter方法。

所以當你不能夠說(你的情況)

ScalaObject$.MODULE$.NAME 

可以說

ScalaObject$.MODULE$.getNAME() 

這將是一個更類似Java的成語,而不是你所希望的那個。

N.B.我還沒有試過@BeanProperty這個全大寫的名字,所以我不確定它會實際產生什麼。

1

不,因爲在字節碼中有訪問字段和調用方法的不同指令。您必須修補Javac(以及您的IDE語法突出顯示器)。

+4

我認爲OP期望一些註解讓scalac生成Java字段,而不是以編譯的Java方法作爲字段的方式。 – themel

+0

@themel是正確的。 –

相關問題