2011-12-27 3 views
1

大きなgroovy/javaプロジェクトを継承していますが、うまく動作しないような使用パターンに悩まされていますが、なぜ。Javaスーパークラスのプロパティを参照するときにgroovyの 'super'キーワードを使用する

私の前身は、Javaスーパークラスをよく使用し、 多くのGroovyサブクラスを頻繁に使用します。サブクラスでは、彼は 遅延初期化を実行するゲッターを持っていて、次にプロパティを使用して の値をスーパークラスに設定します。残念ながら、これはNoSuchFieldErrorをスローするようです。

私は以下の小さなテストケースでこれを再現できました。 "super.property"としてプロパティを参照すると、 NoSuchFieldErrorがスローされますが、単に "プロパティ"として参照すると正常に動作します。

は、ここではいくつかのJavaベースクラスです:

public interface Content { 
    public String getValue(); 
} 

public class HolderJava { 
    private Content _content; 
    public Content getContent() { return _content; } 
    public void setContent(Content value) { _content = value; } 
} 

そしてここでは、それらを拡張し、いくつかのGroovyクラスです:私はgroovyコンソールにコードを貼り付けるとき

class ContentGroovy implements Content { 
    def  value 
    public String getValue() { 
     value 
    } 
} 

class HolderGroovy extends HolderJava { 
    public ContentGroovy getContent() { 
     ContentGroovy newContent = new ContentGroovy() 
     newContent.value = "snarf" 

     // doesn't work, throws NoSuchFieldError 
     //super.content = newContent 

     // works 
     content = newContent 

     newContent 
    } 

    public static void main(String[] args) { 
     println(new HolderGroovy().getContent().getValue()) 
    } 
} 
+0

groovyのユーザーメーリングリストによると、 "super"はプロパティに使用できません。私はこれがドキュメントで参照されているとは思えません。 – lucasmo

答えて

0

正常に動作するように見えました。 Javaがpre-compiledされているか、groovycでコンパイルされていますか?

+0

実際には、Javaはjavacでコンパイルされ、.jarではGroovyがgroovycと別の.jarでコンパイルされます。 eclipse groovyプラグインを使用しても同じ結果が得られますが、Groovy用にJavaとgroovyのEclipse JDTコンパイラを使用しているとは思いますが – lucasmo

関連する問題