Groovy AST Transformations - Как определить тип возвращаемого значения для метода MethodCallExpression? - PullRequest
1 голос
/ 21 декабря 2010

С Groovy AST Transformations , как я могу определить тип возврата MethodCallExpression ?

MethodCallExpression.getType() всегда возвращает java.lang.Object, даже если я явноОпределите тип возвращаемого значения метода в определении метода.

1 Ответ

2 голосов
/ 21 декабря 2010

Из-за динамического характера groovy AST не может знать тип возврата выражения вызова метода во время компиляции.Например:

class Example {
    String foo() { "foo" }
}
def e = new Example()
assert e.foo() == "foo"

Выглядит достаточно просто.foo возвращает строку, поэтому выражение MethodCallExpression для e.foo() должно иметь тип String, верно?Но что, если 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-компилятору просто не хватает информации, чтобы делать какие-либо предположения о вызове метода, поскольку он может измениться во время выполнения, поэтому он должен скомпилировать егодо объекта.

...