Groovy不会推断方法的返回类型

时间:2019-10-08 11:39:56

标签: groovy type-inference return-type typechecking

我试图输入检查一个简单的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

该方法的返回类型推断为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()

那么也许是由于某种原因类型推断不能在同一个类的方法之间传递吗?

1 个答案:

答案 0 :(得分:0)

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

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