![](/img/trans.png)
[英]Upgrading Android project to use Java8 (compileOptions cannot be applied to groovy.lang.closure)
[英]Using groovy.lang.Closure in Java application
我想在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()
}
}
調用groovy閉包來自java,
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)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.