4

我有一些 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) {}
    }
}

生成的代码中的违规行是这样的:

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

编译错误中的96列索引指向类型的<T>参数化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。因此,对 的非原始引用ProcessingQueueMember必须提供两个类型参数。例如,

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

将编译。这段代码可能过于通用。我相信您实际上想要以下两种选择之一:

  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 回答