2010-04-01 4 views
28

Ich habe eine Hierarchie des Falles in Scala-Objekten, die wie folgt aussehen: Wie bekomme ich ein Scala-Fallobjekt aus 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") 

ich auch ein Stück Java-Code habe, in der

ich PressureSensor zugreifen möchte, aber die folgenden nicht funktioniert:

package my.awesome.package.subpackage; 

import my.awesome.package.PressureSensor; 

// Do some stuff, then... 

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

Also, wie referenziere ich das PressureSensor Fallobjekt von Java? Ich dekompilierten den Bytecode für beide PressureSensor und PressureSensor$ Klassen, die die folgenden ergab:

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

Aber das brachte keinen großen Einblick.

+0

Es gibt wirklich keinen Unterschied zwischen 'case object' und' object'. – Jus12

Antwort

31

aus Java, sagen:

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

PressureSensor$.MODULE$ sollten Sie die Instanz des Falles Objekt geben.

5

Dies ist immer noch ein Hack, aber meiner Meinung nach ein bisschen besser lesbar in Java. Fügen Sie einfach eine Methode, um explizit den Hinweis auf die Singleton-Instanz zurückkehren (es zeigt sich als eine statische Methode für die Klasse nach oben):

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 } 

Und dann in Java:

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

Es gibt einen Fehler in der Finsternis beim Schreiben der Klasse, die mit $ endet, die Autokomplikation wird verrückt ... Ihre Lösung ist ein guter Workaround – lqbweb