13

我有一个看起来像这样的java类:

public class Constants {
    public class Commands {
        public static final String CreateOrder = "CreateOrder";
    }
}

我想访问“CreateOrder”常量,在java中我可以像这样轻松访问它:

String co = Constants.Commands.CreateOrder

但是在 Scala 中这不起作用,为什么???如何从 Scala 访问“CreateOrder”,我无法更改 Java 代码。

谢谢。

4

3 回答 3

8

据我所知,没有办法在 Scala 中做你想做的事。

但是,如果您绝对不能更改 Java 代码,那么您可以使用一些反射技巧。

val value = classOf[Constants#Commands].getDeclaredField("CreateOrder").get(null)
于 2013-10-13T13:45:37.007 回答
6

来自Java 语言规范

内部类不能声明静态成员,除非它们是常量变量(第 4.12.4 节),或者发生编译时错误。

在常量变量的情况下,您可以使用Constants.Commands.CreateOrder语法,即使通常任何对 的引用Constants.Commands都必须与 的实例相关联Constants,因为它不是静态内部类。

这在 Java 中可以被认为是一种疯狂的一次性语法特殊情况,这是 Scala 语言设计者没有费心将其融入 Scala 的 Java 互操作性的那种事情。

您最好的选择(如果您的真实 Java 类看起来完全像这样)是创建 的实例Constants,此时您可以以非常自然的方式访问内部类的静态字段:

scala> (new Constants).Commands.CreateOrder
res0: String = CreateOrder

如果由于某种原因这不是一个选项,那么不幸的是,您将不得不在另一个答案中使用基于反射的方法。

于 2013-10-13T14:06:39.223 回答
5

我认为反射和实例化的第三种替代方法是编写一小段 Java 胶水代码。喜欢

public class Glue {
    public static String createOrder() { return Constants.Commands.CreateOrder; }
}

然后从 Scala 你应该能够编写Glue.createOrder.

于 2013-10-13T15:37:35.410 回答