如何从Java"获取"Scala案例对象?

mip*_*adi 33 scala case-class

我在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")
Run Code Online (Sandbox Code Playgroud)

我还有一段我想要访问的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));
Run Code Online (Sandbox Code Playgroud)

那么,我如何PressureSensor从Java 引用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();
}
Run Code Online (Sandbox Code Playgroud)

但这并没有产生任何深刻的见解.

Set*_*sue 37

来自Java,说:

my.awesome.package.PressureSensor$.MODULE$
Run Code Online (Sandbox Code Playgroud)


Geo*_*edy 11

PressureSensor$.MODULE$ 应该给你案例对象的实例.


met*_*sim 6

这仍然是一个黑客,但在我看来,在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 }
Run Code Online (Sandbox Code Playgroud)

然后在Java中:

import my.awesome.package.PressureSensor;
DVShape newshape = DVShapeFactory.createPresetShape(PressureSensor.instance(), new Point3f(0,0,0));
Run Code Online (Sandbox Code Playgroud)