2010-08-24 144 views
15

我有以下的斯卡拉(2.8)代碼:嵌套斯卡拉單身

object A { 
    val message = "hello" 
    object B { 
    val message = "world" 
    } 
} 

而且類似的Java類:

public class C { 
    public static String message() { 
    return "HELLO"; 
    } 
    public static class D { 
    public static String message() { 
     return "WORLD"; 
    } 
    } 
} 

,當我打電話給他們,我期望這些工作從斯卡拉:

scala> A.message 
res0: java.lang.String = hello 

scala> A.B.message 
res1: java.lang.String = world 

scala> C.message 
res2: java.lang.String = HELLO 

scala> C.D.message 
res3: java.lang.String = WORLD 

但是當我嘗試從Java類似的東西,編譯器不喜歡第二行:

System.out.println(A.message()); 
System.out.println(A.B.message()); // cannot find ... symbol : variable B ... 
System.out.println(C.message()); 
System.out.println(C.D.message()); 

很明顯,爲什麼這是這種情況,當我看着類文件javap。我知道我可以使用

System.out.println(A$B$.MODULE$.message()); 

替代,或添加類似val getB = BA對象,並

System.out.println(A.getB().message()); 

更換第二行有沒有辦法使用Java代碼嵌套斯卡拉單一對象的標準方式?

+1

嘛,一個'$ B $ .MODULE $'_is_是一種標準的方式,即使它不是一個特別好的標準方式。 – 2010-08-26 19:06:32

回答

0

一個稍微不同的語法在斯卡拉2.12爲我工作:

鑑於斯卡拉

object A { 
    object B { 
    val message = "world" 
    } 
} 

然後message是從Java accessable通過

A.B.MODULE$.message();