Scala无法访问Java内部类?

我有一个看起来像这样的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 

如果由于某种原因这不是一个选项,你不得不在另一个答案中采用基于reflection的方法,不幸的是。

我认为reflection和实例化的第三种替代方法是编写一小段Java粘合代码。 喜欢

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

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