首先,一些背景知识(或向下跳一点,如果不感兴趣)。 我很恼火和困惑! 这应该是一个非常简单的用例,而事实上我的代码已经被编译刚刚与Eclipse JDT编译很好,所以到现在为止我已经配置Maven以确保做到这一点。 它已经困扰我太多,但它不与Oracle JDK和OpenJDK的编译,因为我认为这实际上可能是我的代码有问题,所以我又看着它。
我想也许该错误是在JDT编译器,允许它来编译,不属于Oracle JDK和OpenJDK的不容许的,这两个我也有测试此。 有问题的原代码要复杂得多,所以这是更难我看到的问题是,事实上,我很惊讶地看到的程度,这可能减少,同时仍没有编制。
IBM的Eclipse JDT编译器或甲骨文的JDK和OpenJDK的有一个非常重大的(恕我直言)错误。
TL; DR
这是有问题的代码的一个相当小的表示。 (结合任何的类型可以通过任何接口代替,编译器行为不会改变):
public class Bug<X extends Property<?, ?> & Anything> {
}
interface Property<C, S extends C> extends PropertyConst<C> {
@Override
public S get();
}
interface PropertyConst<C> {
public C get();
}
interface Anything {
}
总之,我认为这应该编译得很好,但在Oracle JDK 7&8和OpenJDK 7的不同意。 它使用Eclipse朱诺编译我。
当和这两个编译器编译上面的代码中给出了类似下面的错误,但工作得很好,与JDT编译:
Bug.java:3: error: types PropertyConst<?> and Property<?,?> are incompatible; both define get(), but with unrelated return types
public class Bug<X extends Property<?, ?> & Anything> {
^
1 error
这是没有意义的。 返回类型有明显的关系,因为引用不一定frickin'两种方法之一将覆盖其他。 我几乎99%的信心,这应该工作,事实上,去年1%的缺少的是它太基本的一个使用泛型的这个不被发现,但我发现,与没有缺陷报告的唯一原因给它。 (诚然,我没看很难,因为http://bugs.sun.com/仅仅是最差的。你能甚至一个bug报告是否仍然是开放的过滤关键字的搜索结果?哎。)
对我来说,最令人困惑的是,当你删除类型边界对X任何东西,即使多余的接口无关与错误它编译就好了。
任何人都可以把我的心在休息? 任何人都知道它存在于这一点,或者已经有过经验,并能告诉我是什么问题的错误报告? 如果我没有得到任何确凿的答案,我会提交一些bug报告。
编辑:
一对夫妇的人已经指出,我有一个正向基准误差<S扩展了C,C>。 不知道为什么我没有得到这个错误,它甚至编译在Eclipse与JDT ...
无论如何,这仍然无法正常的OpenJDK 7或Oracle JDK 7/8编译我,所以我修改的问题删除问题。
编辑2:
快速检查证实,这种正向参考现在是在Java 7中的法律因为它应该是!
编辑3:
我已经张贴错误报告http://bugs.sun.com/ 。 我会在这里,如果发布链接/他们接受的时候。