Nested Scala singletons from Java code

2020-06-08 13:19发布

问题:

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?

回答1:

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.



回答2:

A slightly different syntax worked for me in Scala 2.12:

Given Scala

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

then message is accessable from Java by

A.B.MODULE$.message();


标签: java scala