1

为什么这个 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++}
         ^
4

2 回答 2

3

您可以通过 @Field 注释解决限制,如下所示:

@Typed def mt(){
    @Field def i = 0
    def c = {i++}
}

assert mt().call() == 0
assert mt().call() == 1
于 2011-08-02T19:22:05.230 回答
1

这个发布到谷歌代码跟踪器的问题指出:

这是设计使然。

并链接到用户组上的一条消息,其中指出:

是的,这是与标准 Groovy 最显着的区别之一。在 Groovy++ 中,共享闭包变量总是最终的。

我看不出您如何以 groovypp 友好的方式重写您拥有的代码,所以我想您要么需要重构代码以另一种方式,要么不将其声明为 @Typed

编辑:我想你可以将行为封装在一个类中,并将方法句柄返回给成员函数

于 2011-08-02T13:39:38.540 回答