classes basics and java scala

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();