Из-за динамического характера 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-компилятору просто не хватает информации, чтобы делать какие-либо предположения о вызове метода, поскольку он может измениться во время выполнения, поэтому он должен скомпилировать егодо объекта.