34

次のようなケースオブジェクトの階層を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));

PressureSensorでは、 Javaからcaseオブジェクトを参照するにはどうすればよいですか?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();
}

しかし、それは素晴らしい洞察をもたらしませんでした。

4

3 に答える 3

38

Javaから、次のように言います。

my.awesome.package.PressureSensor$.MODULE$
于 2010-04-01T15:16:47.793 に答える
11

PressureSensor$.MODULE$ケースオブジェクトのインスタンスを提供する必要があります。

于 2010-04-01T15:18:19.627 に答える
7

これはまだハックですが、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));
于 2013-04-16T15:40:49.390 に答える