Groovy 不推断方法的 return 类型

Groovy doesn't infer the return type of a method

我正在尝试键入检查一个简单的 Groovy 脚本:

@groovy.transform.TypeChecked
class C {
    def fn() { return "result" }
    def ln() { return fn().length() }
}
new C().ln()

我的期望是 fn 方法会被推断为 String,但是当我尝试 运行 脚本时,我得到一个错误:

_GroovyUserScript_: 4: [Static type checking] - Cannot find matching method java.lang.Object#length(). Please check if the declared type is correct and if the method exists.
 @ line 4, column 23.
       def ln() { return fn().length() }
                         ^

1 error

意味着方法的 return 类型被推断为 java.lang.Object。现在,如果我将脚本更改为

@groovy.transform.TypeChecked
    ...
    String fn() { return "result" }
    ...

脚本编译正确。

但是,我注意到以下脚本也可以正确编译:

@groovy.transform.TypeChecked
class C {
    def fn() { return "result" }
}
def x() {
    new C().fn().length()
}
x()

所以问题可能在于类型推断出于某种原因在相同 class 的方法之间不可传递?

在 groovy def 等于 Object 因此,第一种情况正确地失败了。

@groovy.transform.TypeChecked 只检查 class 或它注释的方法。在第二种情况下,方法 def x(){...} 没有注释(它在 class 之外声明)。 因此,在编译步骤没有执行任何验证。