2010-04-01 15 views
28

stworzyłem hierarchia przypadku obiektów w Scala, które wygląda następująco:Jak "dostać" obiekt SCALA z 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") 

mam też kawałek kodu Java, w którym chciałbym dostęp PressureSensor, ale następnego nie działa:

package my.awesome.package.subpackage; 

import my.awesome.package.PressureSensor; 

// Do some stuff, then... 

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

A zatem, w jaki sposób mogę odwoływać się do obiektu przypadku PressureSensor z Javy? I dekompilować kodu bajtowego dla obu klas PressureSensor i PressureSensor$, która dała następujące:

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

Ale nie dały wspaniały wgląd.

+0

naprawdę nie ma różnicy między 'case obiekt' i' obiekt'. – Jus12

Odpowiedz

31

z Jawy, powiedzieć:

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

PressureSensor$.MODULE$ powinno dać wystąpienie przedmiotu sprawy.

5

To wciąż hack, ale moim zdaniem nieco bardziej czytelny w Javie. Wystarczy dodać metodę jawnie powrotu odniesienie do singleton instancji (pokazuje się jako statyczne metody na klasę):

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 } 

a następnie w Javie:

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

Istnieje błąd w zaćmieniu podczas pisania klasy kończącej się na $, autocomplation szaleje ... Twoje rozwiązanie jest miłym obejściem – lqbweb