2010-04-01 22 views
28

Tôi tạo ra một hệ thống các trường hợp các đối tượng trong Scala trông giống như sau:Làm cách nào để "nhận" đối tượng trường hợp Scala từ Java?

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") 

Tôi cũng có một đoạn mã Java trong đó tôi muốn truy cập PressureSensor, nhưng sau đó không làm việc:

package my.awesome.package.subpackage; 

import my.awesome.package.PressureSensor; 

// Do some stuff, then... 

DVShape newshape = DVShapeFactory.createPresetShape(PressureSensor, new Point3f(0,0,0)); 

Vì vậy, làm cách nào để tham chiếu đối tượng trường hợp PressureSensor từ Java? Tôi phân tích với mã byte cho cả PressureSensorPressureSensor$ lớp học, mà mang lại như sau:

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(); 
} 

Nhưng điều đó không mang lại bất cứ cái nhìn sâu sắc tuyệt vời.

+0

Có thực sự là không có sự khác biệt giữa 'đối tượng trường hợp' và' đối tượng'. – Jus12

Trả lời

31

từ Java, nói:

my.awesome.package.PressureSensor$.MODULE$ 
10

PressureSensor$.MODULE$ nên cung cấp cho bạn những thể hiện của đối tượng hợp cụ thể.

5

Đây vẫn là một hack, nhưng theo ý kiến ​​của tôi có thể đọc được nhiều hơn một chút trong Java. Chỉ cần thêm một phương pháp để trở lại một cách rõ ràng ám chỉ đến dụ singleton (nó xuất hiện như một phương pháp tĩnh trên lớp):

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 } 

Và sau đó trong Java:

import my.awesome.package.PressureSensor; 
DVShape newshape = DVShapeFactory.createPresetShape(PressureSensor.instance(), new Point3f(0,0,0)); 
+1

Có lỗi trong nhật thực khi viết lớp kết thúc bằng $, tự động hoàn thành phát điên ... Giải pháp của bạn là giải pháp tốt – lqbweb

Các vấn đề liên quan