【问题标题】:compiler errors::Intellij Idea vs Eclipse编译器错误::Intellij Idea vs Eclipse
【发布时间】:2011-02-14 14:30:40
【问题描述】:

不同的开发人员在我的团队中使用不同的 IDE。一位 Intellij Idea 用户编写了这样的代码

public class Bar<A> extends AbstractSet<Bar.Inner> {  
    class Inner {
    }

    @Override
    public Iterator<Inner> iterator() {
        return null;
    }

    @Override
    public int size() {
        return 0;
    }
}

另一个(eclipse用户)说它只能用替换编译

 public Iterator<Inner> iterator() {

 public Iterator<Bar.Inner> iterator() {

 extends AbstractSet<Bar.Inner>

 extends AbstractSet<Bar<A>.Inner>
 extends AbstractSet<Bar<?>.Inner>//other variant

什么是正确的编译器行为?我在哪里可以获得此类问题的列表?

其他信息
日食:

  • 版本:Helios Service Release 1
  • 构建:20100917-0705
  • jdk:1.6.0_23(安装在电脑上)

想法:

  • 版本:10.0.2
  • 构建:103.72
  • jdk:1.6.0_21(通过帮助 -> 关于)

UPD 是我的失败。 Idea 会报告它,但仅限于应用程序构建。但是,我认为,这也是 Idea 的错误。

【问题讨论】:

  • 想知道他们是否使用相同的 JDK?是否有可能使用 openJDK,其他 Sun?只是我的 2%。
  • @Nishant,他们使用 Sun JDK。但可能版本不同。我应该检查一下。
  • @Nishant,他们使用 Sun JDK。但不同的版本(更新后)。
  • 在 Eclipse 中,Window &gt; Preferences &gt; Java &gt; Installed JREs 查看是否指向正确的 JDK 目录,即 1.6.0_23 ?还要查看他们的编译器级别是否设置为正确的版本,即 1.6。在 Eclipse 中可以从Window &gt; Preferences &gt; Java &gt; compiler 看到它。 1.6.0_23 vs 1.6.0_21 应该不会有这么大的变化。 IDE 不一定使用已安装的 JDK。
  • @Nishant,感谢您提供有关 Eclipse 的信息。 Eclipse 使用已安装的 JDK。编译器合规级别设置为 1.6。

标签: java eclipse intellij-idea


【解决方案1】:

这似乎更可能是底层 JDK 版本问题而不是 IDE 问题 - 您是否检查过它们都使用相同的版本,例如JDK 1.6.0_23?

【讨论】:

  • 不应该这样,因为eclipse使用它的内部编译器独立于已安装的编译器。
【解决方案2】:

您在 about 对话框中看到的 JDK 版本是运行 IDEA 的 java 版本。用于编译的JDK位于Project Structure -> Project -> Project SDK。

我已经使用 java 1.6_20、openjdk 1.6.20 和 java 1.7.0 在 Windows 上的 IDEA Community 10.0.1 上测试了您的代码。这三个都给了我编译器错误。您还可以将您的 IDEA 设置为使用 eclipse 编译器:设置 -> 编译器 -> Java 编译器 -> 使用编译器:Eclipse。它还给出了编译错误:

Eclipse 编译器:

The return type is incompatible with <Test.Inner>.iterator()

Java 7:

Bar is not abstract and does not override abstract method iterator() in AbstractCollection

iterator() in Bar cannot override iterator() in AbstractCollection

method does not override or implement a method from a supertype

Java 6 和 OpenJDK 6:

Bar is not abstract and does not override abstract method iterator() in java.util.AbstractCollection

iterator() in Bar cannot override iterator() in java.util.AbstractCollection; attempting to use incompatible return type
found   : java.util.Iterator<Bar<A>.Inner>
required: java.util.Iterator<Bar.Inner>

method does not override or implement a method from a supertype

所以这不是 IDEA 的问题,而是你用来编译的 JDK 的问题。

【讨论】:

    【解决方案3】:

    我敢打赌 Eclipse JDK 是不同于 Sun 的 IBM 变体。

    【讨论】:

    • 你知道我在哪里可以获得差异列表吗?
    【解决方案4】:

    正如 duffymo 之前所说,Eclipse 不使用 Sun 的 JDK,而是使用自己的编译器(对连续编译和忽略执行期间的一些错误有更好的支持)。

    然而,Eclipse 团队的目标是尽可能与 Sun JDK 保持一致的行为。因此,如果您遇到您认为应该修复的错误,您应该向 Eclipse 团队报告错误。

    可以在我的blog 中阅读类似这样的另一种行为。

    【讨论】:

      【解决方案5】:

      前段时间我遇到了同样的错误。 Eclipse 在这里有错误,编译器在使用 javac 编译时没有抱怨显示错误。我很久以前提交了一个错误,但他们似乎不再有它在数据库中。

      【讨论】:

        猜你喜欢
        • 2013-12-21
        • 1970-01-01
        • 2014-06-22
        • 2018-12-10
        • 1970-01-01
        • 2018-11-11
        • 2015-09-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多