2010-12-21 17 views

回答

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編譯器只是沒有足夠的信息來做出關於方法調用,因爲它可以在運行時更改任何假設,所以它必須編譯到一個對象。