Groovy AST转换 - 如何找出MethodCallExpression的返回类型?

时间:2010-12-21 04:01:44

标签: groovy abstract-syntax-tree

使用Groovy AST Transformations,如何确定MethodCallExpression的返回类型?

即使我在方法定义中明确定义了方法的返回类型,

MethodCallExpression.getType()也始终返回java.lang.Object

1 个答案:

答案 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。