我有以下Scala(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调用它们时,这些工作正如我所期望的那样:
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 = B
之类的内容添加到我的A
对象中,并用
System.out.println(A.getB().message());
是否有一种标准方法可以使用Java代码中嵌套的Scala单例对象?
答案 0 :(得分:2)
我对Scala知之甚少,但考虑到the way Scala is compiled into bytecode,我认为你已经暴露了你唯一的两个选择。
答案 1 :(得分:0)
Scala 2.12中的语法略有不同:
给出Scala
object A {
object B {
val message = "world"
}
}
然后可以通过
从Java访问message
A.B.MODULE$.message();