[英]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.