1
與Groovy AST Transformations,我該如何計算MethodCallExpression的返回類型?Groovy AST轉換 - 我怎樣才能找出MethodCallExpression的返回類型?
MethodCallExpression.getType()
總是返回java.lang.Object
即使我明確定義方法定義中方法的返回類型。
與Groovy AST Transformations,我該如何計算MethodCallExpression的返回類型?Groovy AST轉換 - 我怎樣才能找出MethodCallExpression的返回類型?
MethodCallExpression.getType()
總是返回java.lang.Object
即使我明確定義方法定義中方法的返回類型。
由於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編譯器只是沒有足夠的信息來做出關於方法調用,因爲它可以在運行時更改任何假設,所以它必須編譯到一個對象。