我试图通过匿名抽象类实例,但从groovy类,为用Java编写的类函数提供回调。下面的代码说明了我的问题。
//Java Code
abstract class CallBackWrapper
{
int someAttr, someOtherAttr;
public abstract void execute();
public int getAttr()
{
return someAttr;
}
}
class Delegator
{
public void callExecute(CallBackWrapper w)
{
w.execute();
}
}
//Groovy Code
class GroovyClass
{
private void foo()
{
//Doesn't work
Delegator d = new Delegator();
d.callExecute(new CallBackWrapper() {
public void execute() {
System.out.println("Hello World");
}
});
//Also doesn't work
Delegator d = new Delegator();
d.callExecute([execute:{println "HELLO from Groovy"}] as CallBackWrapper)
}
}
我最接近让它工作的方法是将CallBackWrapper
更改为interface
AND,在Groovy类中声明它。然而,我需要一个抽象类。我的问题是,如何从"GroovyLand"实现这种回调行为,以便Java类能够理解?目前,我遇到了Groovy运行时错误,这些错误对解释问题的真实性质没有太大帮助。
您还没有指定错误,但我在这里尝试了您的代码,得到了以下错误:
$javac*.java&;groovy GroovyClass.groovy&;rm*.级
捕获:java.lang.IollegalAccessError:类GroovyClass$1无法访问其超类CallBackWrapperjava.lang.IollegalAccessError:类GroovyClass$1无法访问其超类CallBackWrapper
这是由于Groovy生成的内部类无法访问CallBackWrapper
。我添加了public
修饰符,效果很好:
// Delegator.java
class Delegator {
public void callExecute(CallBackWrapper w) {
w.execute();
}
}
// CallBackWrapper.java
public abstract class CallBackWrapper {
int someAttr, someOtherAttr;
public abstract void execute();
public int getAttr()
{
return someAttr;
}
}
// GroovyClass.groovy
class GroovyClass
{
private void foo() {
def d = new Delegator()
d.callExecute { println "Hello from groovy" }
}
static main(args) {
new GroovyClass().foo()
}
}
出于好奇,我将Delegator::me()
添加到Java代码中,从Groovy中调用它,它就工作了:
class Delegator {
public void callExecute(CallBackWrapper w) {
w.execute();
}
void me() {
new CallBackWrapper() {
public void execute() {
System.out.println("Echo");
}
}.execute();
}
}
在我看来,这是一个类似的bug。你可以填满一个jira。