2010-04-01 7 views
28

he creado una jerarquía de objetos en el caso Scala que se parece a lo siguiente:¿Cómo obtengo un objeto de caso Scala de Java?

package my.awesome.package 

sealed abstract class PresetShapeType(val displayName: String) 

case object AccelerationSensor extends PresetShapeType("Acceleration Sensor") 
case object DisplacementSensor extends PresetShapeType("Displacement Sensor") 
case object ForceSensor  extends PresetShapeType("Force Sensor") 
case object PressureSensor  extends PresetShapeType("Pressure Sensor") 
case object StrainSensor  extends PresetShapeType("Strain Sensor") 

También tengo una pieza de código Java en el que me gustaría acceder a PressureSensor, pero el siguiente no funciona:

package my.awesome.package.subpackage; 

import my.awesome.package.PressureSensor; 

// Do some stuff, then... 

DVShape newshape = DVShapeFactory.createPresetShape(PressureSensor, new Point3f(0,0,0)); 

Entonces, ¿cómo hago referencia al objeto de caso PressureSensor de Java? Me descompilar el código de bytes para las clases PressureSensor y PressureSensor$, el cual se desprende la siguiente:

Compiled from "DVShapeFactory.scala" 
public final class org.nees.rpi.vis.PressureSensor extends java.lang.Object{ 
    public static final java.lang.Object productElement(int); 
    public static final int productArity(); 
    public static final java.lang.String productPrefix(); 
    public static final int $tag(); 
    public static final java.lang.String displayName(); 
} 

Compiled from "DVShapeFactory.scala" 
public final class org.nees.rpi.vis.PressureSensor$ extends org.nees.rpi.vis.PresetShapeType implements scala.ScalaObject,scala.Product,java.io.Serializable{ 
    public static final org.nees.rpi.vis.PressureSensor$ MODULE$; 
    public static {}; 
    public org.nees.rpi.vis.PressureSensor$(); 
    public java.lang.Object readResolve(); 
    public java.lang.Object productElement(int); 
    public int productArity(); 
    public java.lang.String productPrefix(); 
    public final java.lang.String toString(); 
    public int $tag(); 
} 

Pero eso no dió ningún gran penetración.

+0

en realidad no hay diferencia entre 'case object' y' object'. – Jus12

Respuesta

31

desde Java, dicen:

my.awesome.package.PressureSensor$.MODULE$ 
10

PressureSensor$.MODULE$ debe darle la instancia del objeto caso.

5

Esto sigue siendo un truco, pero en mi opinión un poco más legible en Java. Sólo tiene que añadir un método para devolver de forma explícita la referencia a la instancia Singleton (se muestra como un método estático de la clase):

sealed abstract class PresetShapeType(val displayName: String) 

case object AccelerationSensor extends PresetShapeType("Acceleration Sensor") { def instance = this } 
case object DisplacementSensor extends PresetShapeType("Displacement Sensor") { def instance = this } 
case object ForceSensor extends PresetShapeType("Force Sensor") { def instance = this } 
case object PressureSensor extends PresetShapeType("Pressure Sensor") { def instance = this } 
case object StrainSensor extends PresetShapeType("Strain Sensor") { def instance = this } 

Y luego en Java:

import my.awesome.package.PressureSensor; 
DVShape newshape = DVShapeFactory.createPresetShape(PressureSensor.instance(), new Point3f(0,0,0)); 
+1

Hay un error en eclipse en la clase de escritura que termina en $, la autocomplicación se vuelve loca ... Su solución es una buena solución – lqbweb

Cuestiones relacionadas