16

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
  • 1
    Well, A$B$.MODULE$ is a standard way, even if it is not a particularly nice standard way. Commented Aug 26, 2010 at 19:06

1 Answer 1

2

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.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.