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

时间:2016-07-20 17:43:24

标签: java groovy

我试图通过匿名抽象类实例提供一个用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运行时错误对于解释问题的真实性质并不是很有帮助。

1 个答案:

答案 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。