Scala无法访问Java内部类?

时间:2013-10-13 13:29:27

标签: java scala inner-classes

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

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

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

String co = Constants.Commands.CreateOrder

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

感谢。

3 个答案:

答案 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