Как мне «получить» объект дела Scala из Java? - PullRequest
32 голосов
/ 01 апреля 2010

Я создал иерархию объектов case в 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 case из 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();
}

Но это не принесло какой-либо большой проницательности.

Ответы [ 3 ]

36 голосов
/ 01 апреля 2010

с Java, скажем:

my.awesome.package.PressureSensor$.MODULE$
11 голосов
/ 01 апреля 2010

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

6 голосов
/ 16 апреля 2013

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

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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...