2014-01-09 65 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

是的,这将工作,这是我在以下评论中解释过的。 –