Groovy无法推断方法的返回类型

问题描述 投票:0回答:1

我正在尝试键入检查简单的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()

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

groovy type-inference return-type typechecking
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.