@Typed注释停止Groovy代码编译

时间:2011-08-02 13:22:27

标签: groovy groovy++

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

2 个答案:

答案 0 :(得分:3)

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

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

assert mt().call() == 0
assert mt().call() == 1

答案 1 :(得分:1)

发布到Google代码跟踪器的

This issue声明:

  

这是设计的。

指向message on the user group的链接,其中说明:

  

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

我无法看到你如何以groovypp友好的方式重写你所拥有的代码,所以我猜你要么需要重构代码来做另一种方式,要么不要将它声明为@Typed

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