【问题标题】:Compiling groovy in eclipse gives compile time error在eclipse中编译groovy会产生编译时错误
【发布时间】:2021-05-29 14:47:31
【问题描述】:

我正在进行一个我没有开始但继承了一些要维护的东西的项目。代码是混合了一些 groovy 的 java。我正在使用 Eclipse ......我知道如何拼写“groovy”,但仅此而已,但到目前为止一切都很好...... 问题:

使用 java 8、Eclipse Oxygen(带有 Groovy 2.5.7 编译器),这段看起来像编译的代码没有问题:

class Bgc<T extends Bgc> {
    protected StartListener sln
    interface StartListener
    {
      void onStarted(T cmd)
    }
    
    T onStarted(StartListener startListener)
    {
      this.sln = startListener 
      (T)this
    }
}

FWIW 我们的构建脚本构建这个结构也没有问题......但是如果我尝试在 Eclipse 4.10.0、java 11 中构建它。我的 Eclipse 声称有 2.5.14 编译器和 3.0 编译器用于 groovy。 .. 在这个支持 java 11 的 eclipse 中,这两种选择都不起作用...... Eclipse 4.10.0 只是在“StartListener”界面中给了我一个错误,抱怨 onStarted(T cmd) 正在引用非静态类型 T。

我不明白 Eclipse Oxygen/Java 8/groovyc 2.5.7(允许构建)是否只是忽略了 ...(T cmd)中的“T”,或者是否是较新的 java/groovyc .如果前面的组合忽略了它,那么我可以(大概)删除“T”。

【问题讨论】:

    标签: java eclipse groovy


    【解决方案1】:

    内部接口是静态内部类,因此它不能引用其外部类的任何类型参数。只有非静态成员才能引用 T。

    【讨论】:

    • 所以这似乎表明 eclipse/java/groovyc 的早期版本实际上忽略了类型指定?有没有办法证明这一点,除了一个构建它而另一个不构建它的事实?
    • 您可以在 Java 源代码中设置相同的情况,然后查看编译器的内容。