【问题标题】:How do I "get" a Scala case object from Java?如何从 Java 中“获取”一个 Scala 案例对象?
【发布时间】:2011-02-03 10:07:04
【问题描述】:

我在 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 之间确实没有区别。

标签: scala case-class


【解决方案1】:

来自 Java,比如说:

my.awesome.package.PressureSensor$.MODULE$

【讨论】:

    【解决方案2】:

    PressureSensor$.MODULE$ 应该为您提供案例对象的实例。

    【讨论】:

      【解决方案3】:

      这仍然是一个 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));
      

      【讨论】:

      • 在编写以 $ 结尾的类时,eclipse 中有一个错误,自动编译变得疯狂......您的解决方案是一个很好的解决方法
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-16
      • 1970-01-01
      • 2015-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多