2016-07-20 30 views
0

Javaで書かれたクラス関数へのコールバックを、匿名抽象クラスインスタンスを使用してではなく、groovyクラスから提供しようとしています。以下のコードは私の問題を示しています。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) 
    } 
} 

私はそれが動作するようになってになった最も近いGroovyのクラスの中にそれを宣言するinterfaceCallBackWrapperを変更することです。しかし、私は抽象クラスが必要です。私の質問は、どのようにJavaクラスが理解できるように "Groovy Land"からこのコールバック動作を実装できますか?現時点では、Groovyランタイムエラーが発生し、問題の本質を説明するのにはあまり役に立ちません。

+0

'' d.callExecute {println "HELLO from Groovy"}がCallBackWrapperとして機能します。私はそれを試していないので、今のところそれはコメントです:)。また、それが動作しない場合、エラーは何ですか? – JBaruch

+0

はい、取得している例外を提供してください。 – cjstehno

答えて

0

あなたのエラーを指定していないが、私はここにあなたのコードを試してみましたが、次のエラーました:

$ javac *.java && groovy GroovyClass.groovy && rm *.class

Caught: java.lang.IllegalAccessError: class GroovyClass$1 cannot access its superclass CallBackWrapper java.lang.IllegalAccessError: class GroovyClass$1 cannot access its superclass 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(); 
    } 
} 

が同様のバグのように私には思えますthis one。あなたはジラを埋めることができます。

関連する問題