我试图通过匿名抽象类实例提供一个用Java编写的类函数的回调,但是来自一个groovy类。下面的代码说明了我的问题。
//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类中声明它。但是,我需要一个抽象类。我的问题是,如何从" Groovy Land"中实现这种回调行为?这样Java类可以理解吗?目前,我得到的Groovy运行时错误对于解释问题的真实性质并不是很有帮助。
答案 0 :(得分:0)
您尚未指定错误,但我在此处尝试了您的代码并收到以下错误:
$ javac * .java&& groovy GroovyClass.groovy&& rm * .class
抓住:java.lang.IllegalAccessError:类GroovyClass $ 1无法访问其超类CallBackWrapper java.lang.IllegalAccessError:类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();
}
}
对我来说就像一个类似于this one的错误。你可以填一个jira。