Java与Groovy内/外类差异

lev*_*ied 6 java groovy groovyshell

Java的:

public final class Outer {
   public static void main(String[] args) {
      Inner.inner();
   }

   private static final class Inner {
      private static void inner() {
         System.out.println("inner");
         outer();
      }
   }

   private static void outer() {
      System.out.println("outer");
   }
}
Run Code Online (Sandbox Code Playgroud)

运行时输出:

inner
outer
Run Code Online (Sandbox Code Playgroud)

Groovy的:

public final class Outer {
  static main(String[] args) {
    Inner.inner()
  }

  static outer() {
    println('outer')
  }

  static final class Inner {
    static inner() {
      println('inner')
      outer()
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

运行时输出:

$ groovy Outer
inner
Caught: groovy.lang.MissingMethodException: No signature of method: static Outer$Inner.outer() is applicable for argument types: () values: []
Possible solutions: inner(), use([Ljava.lang.Object;), use(java.lang.Class, groovy.lang.Closure), use(java.util.List, groovy.lang.Closure), putAt(java.lang.String, java.lang.Object), grep()
groovy.lang.MissingMethodException: No signature of method: static Outer$Inner.outer() is applicable for argument types: () values: []
Possible solutions: inner(), use([Ljava.lang.Object;), use(java.lang.Class, groovy.lang.Closure), use(java.util.List, groovy.lang.Closure), putAt(java.lang.String, java.lang.Object), grep()
        at Outer$Inner.inner(Outer.groovy:13)
        at Outer$Inner$inner.call(Unknown Source)
        at Outer.main(Outer.groovy:3)
Run Code Online (Sandbox Code Playgroud)

为什么会出现这种差异?使用Outer.outer()作品,但有什么方法可以避免输入类名?

bdk*_*her 5

您可以在脚本顶部添加import static Outer.outer以避免键入类名(有点)...您至少可以避免在方法内键入它。

为了补充已经提供的解释,如果您在输出阶段检查 Groovy Console 内的 AST 浏览器,您可以看到这两个类都是顶级的,因此“Inner”在没有导入的情况下无法解析为 Outer 的方法。

final public class Outer implements groovy.lang.GroovyObject extends java.lang.    Object { 

}
final public static class Outer$Inner implements groovy.lang.GroovyObject extends java.lang.Object { 

}
Run Code Online (Sandbox Code Playgroud)