java - basics - scala generics
Singletons Scala anidados de código Java (2)
Tengo un poco conocimiento de Scala, pero teniendo en cuenta la forma en que Scala está compilado en el bytecode , creo que ha expuesto las únicas dos opciones que tiene.
Tengo el siguiente código Scala (2.8):
object A {
val message = "hello"
object B {
val message = "world"
}
}
Y una clase similar de Java:
public class C {
public static String message() {
return "HELLO";
}
public static class D {
public static String message() {
return "WORLD";
}
}
}
Estos funcionan como yo esperaría cuando los llame desde 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
Pero cuando intento algo similar desde Java, al compilador no le gusta la segunda línea:
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());
Está claro por qué este es el caso cuando miro los archivos de clase con javap
. Sé que puedo usar
System.out.println(A$B$.MODULE$.message());
en su lugar, o agregue algo como val getB = B
a mi objeto A
y reemplace la segunda línea con
System.out.println(A.getB().message());
¿Existe una forma estándar de usar objetos Singalaon Scala anidados desde código Java?
Una sintaxis ligeramente diferente me funcionó en Scala 2.12:
Scala dado
object A {
object B {
val message = "world"
}
}
entonces el message
es accesible desde Java por
A.B.MODULE$.message();