gpt4 book ai didi

java - Groovy 中的静态编译

转载 作者:行者123 更新时间:2023-11-30 04:04:44 32 4
gpt4 key购买 nike

我正在关注以下讨论:http://docs.codehaus.org/display/GroovyJSR/GEP+10+-+Static+compilation

代码:

    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"????

现在,根据链接,它应该使用 Object 参数而不是字符串调用 foo 方法,因为闭包的工作方式与方法不同,因为闭包中传递的变量是一个 Object,它应该使用 Object 参数调用该方法。

但它使用 String 参数调用 foo 方法。

我使用的是 groovy 2.2.1。

<小时/>

我是 Groovy 的新手,所以有点困惑它应该如何工作。

在上面的示例中,如果我们希望上述代码的性能和行为像 Java 中那样工作,那么我们必须使用:

@groovy.transform.CompileStatic

这将确保方法调用是在编译 block 期间完成的,而不是在运行时完成的,从而增强了代码的性能。

但是如果我们想使用它,那么我们就不能使用闭包,因为这不会编译(就像在 Java 中一样)。

因此,我们可以使用方法来代替闭包。

为了测试,用具有相同逻辑的方法替换闭包,并且它应该以 Object 作为参数调用 foo 方法。

当我们使用 @groovy.transform.CompileStatic 时,对于 groovy 新手来说还有一件事代码的性能显着提高了 2-2.5 倍。

最佳答案

我没有看到您在上面的代码中使用 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"????

关于java - Groovy 中的静态编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21029038/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com