从Groovy提供对Java函数调用的回调



我试图通过匿名抽象类实例,但从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更改为interfaceAND,在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。

最新更新