2011-12-08 8 views
8

Dado el siguiente objeto Scala:¿Puedo acceder al valor de un objeto Scala sin paréntesis de Java?

object ScalaObject { 
    val NAME = "Name" 
} 

Parece que el compilador Scala genera un método sin parámetros para acceder al campo NAME. Sin embargo, cuando intento acceder a este campo desde Java, parece que la única forma de acceder a este campo es como un método sin parámetros como:

System.out.println(ScalaObject$.MODULE$.NAME()); 

¿Hay una manera de convencer al compilador Scala para permitir Java para el acceso la val por el lenguaje Java como se esperaba:

System.out.println(ScalaObject$.MODULE$.NAME); 
+0

¿Pasa lo mismo con los vals de minúsculas? – ziggystar

+0

No es el idioma esperado * Java * por cierto, es el idioma esperado * Scala *. En términos de bytecode, Scala (¿casi?) Siempre expone los campos como métodos getter con el mismo nombre. –

+1

@AndrzejDoyle, no estoy seguro de lo que dices. En Java, se espera que acceda a campos finales estáticos sin paréntesis porque es la única manera de hacerlo. Lo que parece sugerir es que en Scala, la técnica esperada es usar métodos getter. De todos modos, cualquiera que sea la técnica preferida de Scala, no parece relevante para un cliente Java de una API que se implementa en Scala. –

Respuesta

7

Estrictamente, la respuesta es no, porque scala no está generando solo un campo, sino un par de métodos para acceder a él. Sin embargo, anotar la scala val con @scala.reflect.BeanProperty producirá métodos get y setter de estilo Java.

así que mientras usted no sería capaz de decir (en su caso)

ScalaObject$.MODULE$.NAME 

Se le poder decir

ScalaObject$.MODULE$.getNAME() 

lo que sería una de Java como lenguaje más , simplemente no es el que estabas esperando.

N.B. No he probado @BeanProperty con un nombre mayúsculo como ese, así que no estoy seguro de lo que realmente produciría.

1

No, porque en el código de bytes existen instrucciones diferente para acceder campo e invocar el método. Debe aplicarle un parche Javac (y su resaltador de sintaxis IDE).

+4

Creo que el OP espera que algunas anotaciones hagan que scalac produzca campos Java, no una forma de acceder a los métodos compilados de Java como campos. – themel

+0

@themel es correcto. –

Cuestiones relacionadas