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 で修正されているため、この問題が引き続き発生する場合は、これらのバージョンのいずれかにアップグレードしてください。:)