如何从Java中“获取”Scala的case object?

36

我在Scala中创建了一个案例对象的层次结构,如下所示:

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案例对象? 我反编译了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();
}

但这并没有带来任何重大的见解。


case objectobject之间实际上没有任何区别。 - Jus12
3个回答

43

来自Java的说:

my.awesome.package.PressureSensor$.MODULE$

11

PressureSensor$.MODULE$应该给出 case 对象的实例。


7

这仍然是一个 hack,但在我看来,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,如果以$结尾的类名,在自动补全时会出现错误…不过您提供的解决方法是一个很好的变通方式。 - lqbweb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接