不同的开发人员在我的团队中使用不同的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
什么是正确的编译器行为?哪里可以列出这些问题?
其他信息
日食:
想法:
UPD 这是我的失败。 Idea会报告它,但仅限于应用程序构建。但是,我认为,这也是Idea的错误。
答案 0 :(得分:2)
这看起来更像是一个基础JDK版本问题而不是IDE版本 - 如果你检查它们都使用相同的版本,例如JDK 1.6.0_23?
答案 1 :(得分:1)
我敢打赌,Eclipse JDK是一个与Sun不同的IBM变体。
答案 2 :(得分:1)
您在about对话框中看到的JDK版本是运行的IDEA IDEA。用于编译的JDK位于项目结构 - &gt;项目 - &gt;项目SDK。
我已经使用java 1.6_20,openjdk 1.6.20和java 1.7.0在Windows上的IDEA Community 10.0.1上测试了您的代码。这三个都给了我编译错误。您还可以将IDEA设置为使用eclipse编译器:设置 - &gt;编译器 - &gt; Java编译器 - &gt;使用编译器: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 :(得分:1)
正如duffymo之前所说,Eclipse不使用Sun的JDK,而是使用自己的编译器(它更好地支持连续编译并在执行期间忽略一些错误)。
然而,Eclipse团队的目标是尽可能地与Sun JDK保持一致的行为。因此,如果您收到一个您认为应该修复的错误,那么您应该向Eclipse团队报告错误。
可以在我的blog中阅读此类其他行为。
答案 4 :(得分:0)
前段时间我有同样的错误。 Eclipse在这里有错误,编译器没有抱怨,而使用javac进行编译时显示错误。我很久以前就提交了一个bug,但它们似乎不再存在于数据库中了。