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