2010-08-24 15 views
15

Tengo el siguiente Scala (2,8) Código:únicos anidada Scala de código Java

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

Y una clase Java similar:

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 que cuando los llamo de 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 de Java, el 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 utilizar

System.out.println(A$B$.MODULE$.message()); 

su lugar, o añadir algo como val getB = B a mi objeto A y vuelva a colocar la segunda línea con

System.out.println(A.getB().message()); 

¿Hay una manera estándar para usar anidados objetos únicos Scala de código Java ?

+1

Bueno, 'A $ B $ .module $ '_es_ una manera estándar, incluso si no es una forma estándar particularmente agradable. –

Respuesta

0

Una sintaxis ligeramente diferente trabajó para mí en Scala 2.12:

Dada Scala

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

continuación message es accesible desde Java

A.B.MODULE$.message(); 
Cuestiones relacionadas