可能的Java编译器错误! 程序不能与某些编译器编译(Possible Java compile

2019-07-04 01:35发布

首先,一些背景知识(或向下跳一点,如果不感兴趣)。 我很恼火和困惑! 这应该是一个非常简单的用例,而事实上我的代码已经被编译刚刚与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/ 。 我会在这里,如果发布链接/他们接受的时候。

Answer 1:

这显然是一个错误的javac,你应该报告。 你可能有更好的运气,要求开放JDK的邮件列表。 但它的感恩节等等...

这不是泛型的基本用法,虽然,这是相当复杂的。



Answer 2:

我已经进入你的样品到我的Eclipse靛蓝(3.7.1)和它有关的声明立即抱怨Property界面。

非法前向引用类型参数C

而对于线public S get();

返回类型是不兼容PropertyConst.get()

改变的申报Property ,以该

interface Property<C, S extends C > extends PropertyConst<C> {
    @Override
    public S get();
}

固定两个错误,无论是在JDT和Sun的1.6编译器编译



Answer 3:

没试出来,但在

public class Bug<X extends Property<?, ?> & Anything> {

在这儿,没有束缚? 的。 人们会需要这样的东西:

public class Bug<C, X extends Property<C, ? extends C> & Anything> {


文章来源: Possible Java compiler bug! Program does not compile with some compilers