Joh*_*sen 4 java generics groovy inner-classes
我有一些Groovy代码在Groovy字节码编译器中工作正常,但由它生成的Java存根导致Java编译器出错.我认为这可能是Groovy存根生成器中的另一个错误,但我真的无法弄清楚为什么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) {}
}
}
Run Code Online (Sandbox Code Playgroud)
生成的代码中的违规行是这样的:
protected java.util.Queue<nz.ac.auckland.digitizer.AbstractProcessingQueue.ProcessingQueueMember<T>> items;
Run Code Online (Sandbox Code Playgroud)
这会产生以下编译错误:
[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
Run Code Online (Sandbox Code Playgroud)
编译错误中的列索引96指向类型的<T>参数化ProcessingQueueMember.但ProcessingQueueMember它不是编译器声称的原始类型,它是泛型类型:
private class ProcessingQueueMember
<E> extends java.lang.Object implements
groovy.lang.GroovyObject { ...
Run Code Online (Sandbox Code Playgroud)
我很困惑为什么编译器认为类型Queue<ProcessingQueueMember<T>>无效.Groovy源编译得很好,生成的Java代码看起来也非常正确.我在这里错过了什么?是否与所讨论的类型是嵌套类这一事实有关?
(如果有人有兴趣,我已在此问题中提交了与此问题有关的错误报告)
编辑:事实证明这确实是一个存根编译器错误 - 这个问题现在已在1.8.9,2.0.4和2.1中修复,所以如果你仍然有这个问题,只需升级到其中一个版本.:)
由于ProcessingQueueMember类是非静态内部类AbstractProcessingQueue,其体可以引用T类型参数AbstractProcessingQueue.因此,ProcessingQueueMember必须提供类型参数的非原始引用.例如,
protected java.util.Queue<AbstractProcessingQueue<T>.ProcessingQueueMember<T>> items;
Run Code Online (Sandbox Code Playgroud)
将编译.此代码可能过于通用.我相信你真的想要这两种选择中的一种:
ProcessingQueueMember<E>static(即嵌套类而不是内部类)ProcessingQueueMember我对groovy存根生成器一无所知,但也许有一些方法可以注释你的groovy代码来表达它?
| 归档时间: |
|
| 查看次数: |
2227 次 |
| 最近记录: |