2011-02-09 60 views
7

假設MyClass是一個在Java中定義的類,並且有許多靜態成員和非靜態成員。我試圖別名Scala的對象MyObject這個類(以及相關的配套對象)如下圖所示:靜態類型別名Java類

object MyObject { 
    import javastuff._ 
    type MyAlias = MyClass 
    val MyAlias = MyClass 
} 

Scalac抱怨:

error: object MyClass is not a value 
val MyAlias = MyClass 

如何解決此問題?謝謝。

+3

你究竟想要使用`val MyAlias`呢?類型別名是用`type`關鍵字完成的,你已經完成了。 `val MyAlias`是一個值聲明,MyClass是一個類型名稱而不是一個值,所以你不能將MyClass賦給`val MyAlias`。請給我們幾個用例。 – 2011-02-09 10:25:35

+3

@Wong,由於Java靜態方法的調用是通過JavaClass.staticMethod來完成的,就好像JavaClass是一個Scala對象一樣,@Siddharth想要一種方法來以類似於它可以實現的方式「替代」類方法的表示斯卡拉關於斯卡拉的「對象」,例如`val obj = scalaObject`。 – pedrofurla 2011-02-09 11:26:30

回答

6

雖然這對於類+伴隨對象在純Scala中起作用,但對於Java的靜態方法來說這是不可能的,因爲它們不屬於任何接口。

Scala 可能理論上講,創建一個包含委託給某個類的所有靜態方法的對象,但它目前沒有這樣做。如果你願意編寫插件,也可以編寫一個編譯器插件。

如果做不到這一點,你必須自己創建一個充滿委託的對象,或者選擇一些方法並將它們作爲函數傳遞。

0

對於Java的靜態方法是不可能的,因爲它們不屬於任何接口。

更新5年以後:PR 5131提到:

我們用來禁止代靜態轉發器時,對象有 特質作爲一個伴侶,因爲一個無法與機構方法添加到一個 接口在JVM 6.

JVM解除了此限制,以支持接口中的默認方法, ,因此我們也可以解除對靜態轉發器的限制。

修復scala-dev issue 59

Jason Zaugg (retronym)commit 41c9a17