2010-04-01 6 views
28

Я создал иерархию объектов в случае Scala, который выглядит следующим:Как «получить» объект объекта Scala с 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") 

У меня есть кусок кода Java, в котором я хотел бы получить доступ к PressureSensor, но ниже не работает:

package my.awesome.package.subpackage; 

import my.awesome.package.PressureSensor; 

// Do some stuff, then... 

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

Итак, как мне связать объект-объект PressureSensor с Java? Я декомпилировали байт-код для обоих PressureSensor и PressureSensor$ классов, которые были получены следующие:

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

Но это не дает никакой большое понимание.

+0

Там действительно никакой разницы между 'case object' и' object'. – Jus12

ответ

31

от Java, скажет:

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

PressureSensor$.MODULE$ должен дать вам экземпляр объекта дела.

5

Это все еще хак, но, на мой взгляд, более читаемый на Java. Просто добавьте метод явно возвращать ссылку на одноплодный экземпляр (он отображается как статический метод на классе):

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 } 

, а затем в Java:

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

В затмении есть ошибка при написании класса, заканчивающегося на $, автокомпьютация сходит с ума ... Ваше решение - хорошее обходное решение – lqbweb