我有一个看起来像这样的java类:
public class Constants {
public class Commands {
public static final String CreateOrder = "CreateOrder";
}
}
我想访问“CreateOrder”常量,在java中我可以像这样轻松访问它:
String co = Constants.Commands.CreateOrder
但在Scala这不起作用为什么???
如何从Scala访问“CreateOrder”,我无法改变Java代码。
谢谢。
据我所知,没有办法在Scala中做你想做的事。
但是如果你绝对无法改变Java代码,那么你可以采用一些反思技巧。
val value = classOf[Constants#Commands].getDeclaredField("CreateOrder").get(null)
来自 Java语言规范:
内部类可能不会声明静态成员,除非它们是常量变量(第4.12.4节),否则会发生编译时错误。
在常量变量的情况下,您可以使用 Constants.Commands.CreateOrder
语法,即使通常是任何引用 Constants.Commands
必须与一个实例相关联 Constants
因为它不是一个静态的内部类。
这可以被认为是Java中一个疯狂的一次性语法特殊情况,而Scala语言设计者并没有费心去融入Scala的Java互操作性。
你最好的选择(如果真正的Java类看起来完全像这样)是创建一个实例 Constants
,此时您可以以完全自然的方式访问内部类的静态字段:
scala> (new Constants).Commands.CreateOrder
res0: String = CreateOrder
如果由于某种原因这不是一个选项,你不得不在另一个答案中采用基于反射的方法,不幸的是。
我认为反射和实例化的第三种替代方法是编写一小段Java粘合代码。喜欢
public class Glue {
public static String createOrder() { return Constants.Commands.CreateOrder; }
}
然后从Scala你应该能够写 Glue.createOrder
。