4

Groovy バイトコード コンパイラで正常に動作する Groovy コードがいくつかありますが、それによって生成された Java スタブが Java コンパイラでエラーを引き起こします。これはおそらく Groovy スタブ ジェネレーターのもう 1 つのバグだと思いますが、Java コンパイラーが生成されたコードを気に入らない理由が本当にわかりません。

以下は、生成された Java クラスの切り詰められたバージョンです (見苦しい書式設定はご容赦ください)。

@groovy.util.logging.Log4j() public abstract class AbstractProcessingQueue
<T>  extends nz.ac.auckland.digitizer.AbstractAgent  implements
    groovy.lang.GroovyObject {
        protected int retryFrequency;
        protected java.util.Queue<nz.ac.auckland.digitizer.AbstractProcessingQueue.ProcessingQueueMember<T>> items;
        public AbstractProcessingQueue
        (int processFrequency, int timeout, int retryFrequency) {
             super ((int)0, (int)0);
    }

    private enum ProcessState
      implements
    groovy.lang.GroovyObject {
        NEW, FAILED, FINISHED;
    }

    private class ProcessingQueueMember<E>  extends java.lang.Object  implements
    groovy.lang.GroovyObject {
        public ProcessingQueueMember
        (E object) {}
    }
}

生成されたコードの問題のある行は次のとおりです。

protected java.util.Queue<nz.ac.auckland.digitizer.AbstractProcessingQueue.ProcessingQueueMember<T>> items;

次のコンパイル エラーが発生します。

[ERROR] C:\Documents and Settings\Administrator\digitizer\target\generated-sources\groovy-stubs\main\nz\ac\auckland\digitizer\AbstractProcessingQueue.java:[14,96] error: improperly formed type, type arguments given on a raw type

<T>コンパイル エラーの列インデックス 96 は、型のパラメーター化を指していますProcessingQueueMember。ただしProcessingQueueMember、コンパイラが主張するように生の型ではなく、ジェネリック型です。

private class ProcessingQueueMember
<E>  extends java.lang.Object  implements
groovy.lang.GroovyObject { ...

Queue<ProcessingQueueMember<T>>コンパイラが型が無効であると考える理由について、私は非常に混乱しています。Groovy ソースは正常にコンパイルされ、生成された Java コードも完全に正しいように見えます。ここで何が欠けていますか?問題の型がネストされたクラスであるという事実と関係がありますか?

(誰かが興味を持っている場合は、この質問の問題に関連するこのバグレポートを提出しました)

編集: これは確かにスタブ コンパイラのバグであることが判明しました。この問題は現在、1.8.9、2.0.4、および 2.1 で修正されているため、この問題が引き続き発生する場合は、これらのバージョンのいずれかにアップグレードしてください。:)

4

2 に答える 2

8

ProcessingQueueMemberクラスは の非静的内部クラスであるためAbstractProcessingQueue、その本体は のT型パラメータを参照できますAbstractProcessingQueue。したがって、への非 raw 参照は、ProcessingQueueMember両方の型引数を提供する必要があります。例えば、

protected java.util.Queue<AbstractProcessingQueue<T>.ProcessingQueueMember<T>> items;

コンパイルします。このコードはおそらく過度に一般的です。実際には、次の 2 つの選択肢のいずれかが必要だと思います。

  1. 静的ProcessingQueueMember<E>にする (つまり、内部クラスではなくネストされたクラス)
  2. から型パラメーターを削除しますProcessingQueueMember

Groovy スタブ ジェネレーターについては何も知りませんが、これを表現するために Groovy コードに注釈を付ける方法はあるのでしょうか?

于 2012-08-28T22:29:09.250 に答える
0

変数宣言()を含むクラスのジェネリック型パラメーターprotected java.util.Queue<nz.ac.auckland.digitizer.AbstractProcessingQueue.ProcessingQueueMember<T>> items;が欠落している可能性がありますか?

于 2012-08-28T22:07:44.927 に答える