Nested Scala singletons from Java code
I have the following Scala (2.8) code:
object A {
val message = "hello"
object B {
val message = "world"
}
}
And a similar Java class:
public class C {
public static String message() {
return "HELLO";
}
public static class D {
public static String message() {
return "WORLD";
}
}
}
These work as I'd expect when I call them from 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
But when I try something similar from Java, the compiler doesn't like 开发者_开发技巧the second line:
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());
It's clear why this is the case when I look at the class files with javap
. I know I can use
System.out.println(A$B$.MODULE$.message());
instead, or add something like val getB = B
to my A
object and replace the second line with
System.out.println(A.getB().message());
Is there a standard way to use nested Scala singleton objects from Java code?
I'm have little knownledge of Scala, but considering the way Scala is compiled into bytecode, I think you have exposed the only two options you have.
精彩评论