2014-01-09 62 views
1

我下面給定的討論:http://docs.codehaus.org/display/GroovyJSR/GEP+10+-+Static+compilation靜態編譯在Groovy

代碼:

void foo(String msg) { println msg } 
    void foo(Object msg) { println 'Object' } 

    def doIt = {x -> 
     Object o = x 
     foo(o) 
    } 

    def getXXX() { "return String" } 

    def o2=getXXX() 
    doIt o2 // "String method" or "Object method"???? 

現在基於它應該調用對象的參數,而不是字符串,因爲關閉foo的方法鏈接因爲在閉包中傳遞的變量是一個Object,所以它應該與Object參數一起調用該方法。

但它使用String參數調用foo方法。

我正在使用groovy 2.2.1。


我是新來groovy所以有點困惑,它應該如何工作。

在上面的例子,如果我們想在上面的代碼的性能和行爲像它在Java中工作,那麼我們必須使用:

@groovy.transform.CompileStatic 

這將確保該方法調用的過程中完成編譯切片而不是在運行時增強代碼的性能。

但是,如果我們想要使用這個,那麼我們不能使用閉包,因爲這將不會編譯(如在Java中)。

因此,而不是使用閉包,我們可以使用一種方法。

爲了測試,用一個具有相同邏輯的方法替換閉包,它應該用Object作爲參數調用foo方法。

當我們使用@groovy.transform.CompileStatic時,對於一個新手常用的人來說還有一件事,代碼的性能顯着提高了2-2.5倍。

回答

2

我沒有看到你在上面的代碼中使用CompileStatic註釋。如果您將代碼修改爲以下代碼,那麼您將看到foo(Object)方法被調用:

void foo(String msg) { println msg } 

void foo(Object msg) { println 'Object' } 

@groovy.transform.CompileStatic 
def doIt(def x) { 
    Object o = x 
    foo(o) 
} 

def getXXX() { "return String" } 

def o2=getXXX() 
doIt o2 // "String method" or "Object method"???? 
+0

是的,這將工作,這是我在以下評論中解釋過的。 –