簡體   English   中英

提供來自Groovy的Java函數調用的回調

[英]Provide callback to Java function call from 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 並在Groovy類中聲明它。 但是,我需要一個抽象類。 我的問題是,如何才能從“ Groovy Land”實現此回調行為,以便Java類能夠理解? 目前,我收到了Groovy運行時錯誤,這些錯誤對於解釋問題的真正本質不是很有幫助。

您尚未指定錯誤,但是我在這里嘗試了您的代碼,並收到以下錯誤:

$ 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()
    }
}

出於好奇,我在Java代碼中添加了Delegator::me() ,並從Groovy對其進行了調用,它的工作原理是:

class Delegator {
    public void callExecute(CallBackWrapper w) {
        w.execute();
    }
    void me() {
        new CallBackWrapper() {
            public void execute() {
                System.out.println("Echo");
            }
        }.execute();
    }
}

在我看來就像是一個類似於錯誤的錯誤。 你可以裝一個吉拉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM