2010-04-01 6 views
28

Ho creato una gerarchia di oggetti caso in Scala che è simile al seguente:Come posso ottenere un oggetto caso Scala da 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") 

Ho anche un pezzo di codice Java in cui mi piacerebbe accedere PressureSensor, ma il seguente non funziona:

package my.awesome.package.subpackage; 

import my.awesome.package.PressureSensor; 

// Do some stuff, then... 

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

Quindi, come si fa riferimento all'oggetto del caso PressureSensor da Java? Ho decompilato il codice byte per entrambe le classi PressureSensor e PressureSensor$, che ha prodotto il seguente:

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

Ma questo non ha dato alcun grande intuizione.

+0

non c'è davvero nessuna differenza tra 'caso oggetto' e' oggetto'. – Jus12

risposta

31

da Java, dicono:

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

PressureSensor$.MODULE$ dovrebbe darvi l'istanza dell'oggetto caso.

5

Questo è ancora un hack, ma a mio parere un po 'più leggibile in Java. Basta aggiungere un metodo per restituire in modo esplicito il riferimento all'istanza Singleton (si presenta come un metodo statico della classe):

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 } 

E poi in Java:

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

C'è un bug in eclissi sulla scrittura di una classe che termina con $, l'autocomplazione diventa pazzesca ... La tua soluzione è una buona soluzione – lqbweb