2010-04-01 33 views
28

我创建情况下层次结构在Scala中,看起来像以下对象:如何从Java中“获取”Scala case对象?

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

那么,我该如何参考来自Java的PressureSensor case对象呢?我反编译了两个PressureSensorPressureSensor$类的字节码,取得了以下内容:

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 2016-10-15 17:30:42

回答

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

在编写以$结尾的eclipse中存在一个bug,autocomplation会变得疯狂......您的解决方案是一个很好的解决方法 – lqbweb 2013-05-20 00:03:49