使用Groovy AST Transformations,如何确定MethodCallExpression的返回类型?
即使我在方法定义中明确定义了方法的返回类型, MethodCallExpression.getType()
也始终返回java.lang.Object
。
答案 0 :(得分:2)
由于groovy的动态特性,AST无法在编译时知道方法调用表达式的返回类型。例如:
class Example {
String foo() { "foo" }
}
def e = new Example()
assert e.foo() == "foo"
看起来很简单。 foo
返回一个字符串,因此e.foo()
的MethodCallExpression的类型应为String
,对吧?但是如果在metaClass中更改foo会怎么样?
class Example {
String foo() { "foo" }
}
def e = new Example()
if (someRuntimeCondition) {
e.metaClass.foo = { -> 42 }
}
assert e.foo() == "foo" // is foo a String or an Int?
groovy编译器没有足够的信息来对方法调用做任何假设,因为它可能在运行时更改,因此必须将其编译为Object。