Вложенные Scala синглтоны из Java-кода

У меня есть следующий код 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());

Существует ли стандартный способ использования вложенных объектов Scala singleton из Java-кода?

Ответы

Ответ 2

Несколько разный синтаксис работал у меня в Scala 2.12:

Учитывая Scala

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

тогда message можно получить из Java через

A.B.MODULE$.message();