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()作品,但有什么方法可以避免输入类名?
您可以在脚本顶部添加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)
| 归档时间: |
|
| 查看次数: |
787 次 |
| 最近记录: |