为什么这个Groovy代码......
def mt(){
def i= 0
def c= {i++}
}
...编译,但是这个Groovy代码......
@Typed def mt(){
def i= 0
def c= {i++}
}
...无法编译错误...
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
C:\Users\gavin\Documents\Personal\Groovy\otherRun.groovy: 5:
Cannot modify final field otherRun$mt$1.i @ line 5, column 11.
def c= {i++}
^
答案 0 :(得分:3)
您可以通过@Field注释解决限制,如下所示:
@Typed def mt(){
@Field def i = 0
def c = {i++}
}
assert mt().call() == 0
assert mt().call() == 1
答案 1 :(得分:1)
This issue声明:
这是设计的。
指向message on the user group的链接,其中说明:
是的,这是与标准Groovy最显着的差异之一。 在Groovy ++中,共享闭包变量总是最终的。
我无法看到你如何以groovypp友好的方式重写你所拥有的代码,所以我猜你要么需要重构代码来做另一种方式,要么不要将它声明为@Typed
编辑 :我猜你可以将行为封装在一个类中,并将方法句柄返回给成员函数