我想在Java应用程序中使用Groovy Closure类,但遇到了比预期更麻烦的问题。这是我的代码:
int count = 0;
groovy.lang.Closure closure = { count = 1 };
然而,当我尝试使用JDK 7编译它时,我收到了错误:illegal initializer for Closure
我是否漏掉了什么非常明显的东西?谢谢你的帮助。
正如Oliver所说,Java不支持这种语法。(免责声明:所有代码未经测试)你可以这样做:
Closure closure = new Closure(null) {
public Object doCall() {
/* some code here */
}
};
但是这样做无法在该方法内设置count,因为这是Java匿名内部类,因此count必须为final。您可以通过任何形式的重定向来绕过此限制,例如使用数组。或者您可以模仿Groovy的做法并使用以下内容:
import groovy.lang.*;
Reference count = new Reference(0);
Closure closure = new Closure(this) {
public Object doCall() {
count.set(1);
}
};
以上已有答案,我只是添加一个可行的示例。
Groovy代码接受闭包:
public class GroovyService {
Integer doSomething(Closure<Integer> fn) {
fn()
}
}
从Java中调用Groovy闭包
import groovy.lang.Closure;
public class JavaCanCallGroovy {
public static void main(String[] args) {
GroovyService service = new GroovyService();
Integer data = service.doSomething(new Closure<Integer>(null) { //need to pass owner = null
@Override
public Integer call() {
return 100;
}
});
System.out.println(data);
}
}
如何从Scala中调用Groovy闭包
import groovy.lang.Closure
object ScalaCanCallGroovy extends App {
private val closure = new Closure[Integer]() {
override def call() = 1
}
val groovyService = new GroovyService
val data = groovyService.doSomething(closure)
assert(data == 1)
}