加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

Oracle JDK和Eclipse JDT编译器纷歧致!哪个不正确地编译?不寻

发布时间:2021-01-13 07:07:36 所属栏目:站长百科 来源:网络整理
导读:我有一段代码在Oracle JDK 7和 Eclipse JDT 7之间编译纷歧致,但因为我不确定哪个编译器犯了错误,我以为在提交任何错误陈诉之前我应该??在这里征求意见. 这是我可以提出的最简朴的测试来证明纷歧致性: interface FooS extends FooS,T,T { // should this com

我有一段代码在Oracle JDK 7和 Eclipse JDT 7之间编译纷歧致,但因为我不确定哪个编译器犯了错误,我以为在提交任何错误陈诉之前我应该??在这里征求意见.

这是我可以提出的最简朴的测试来证明纷歧致性:

interface Foo<S extends Foo<S,T>,T> {
    // should this compile?
    public <X extends Foo<S,Y>,Y> Y method1();

    // what about this?
    public <X extends Foo<? extends S,Y> Y method2();
}

Oracle JDK在method1上给出了错误,但没有给出method2,而Eclipse对这两种要领都没有题目.我乃至不确定任何一种要领都应该编译……

假如这两个要领都不该该编译开始,那么以下几点没有现实意义,但我认为假如我们添加以下代码,两个编译器城市堕落:

interface Bar extends Foo<Bar,Integer> {
}

class Bug {
    void bug() {
        Bar bar = null;
        Double bubble;

        // these fail as expected...
        bar.<Foo<Bar,Double>,Double> method1();
        bar.<Foo<? extends Bar,Double> method2();

        // ...but these don't even though the inferred parametrisations should be
        // the same as above
        Double bobble = bar.method1();
        Double babble = bar.method2();
    }
}

当我们为method1和method2提供显式参数化时,我找不到任何会导致返回Double的有用挪用(即,当行使Double参数化时,我找不到X的有用参数化).这是我祈望的举动,就我所见,这里的Y应该只能用Integer参数化.

可是,当我们让编译器揣度参数化时,Oracle JDK和Eclipse JDT都应承行使Y揣度的挪用为Double.假如将鼠标悬停在Eclipse中的挪用上,它乃至会表现参数化与我们手动失败的参数化完全沟通,那么为什么差异的举动呢?

(此时分派给新变量bobble和babble的缘故起因是悬停文本表现差异的参数 – 因为某种缘故起因将Double替代为Object – 假如我们再次分派给bubble.它如故编译两个挪用并分派给双打,以是我不知道为什么会这样.)

以是,这也许是我的另一个相等暗昧的题目,可是这里的任何人都可觉得我阐发这一点吗?

编辑:

Eclipse的错误陈诉:https://bugs.eclipse.org/bugs/show_bug.cgi?id=398011

办理要领

好像编译器做了某种简化. Foo.method1和Foo.method2用两个参数X和Y声明,个中一个参数可以在揣度时代确定,可是基础不行使X.

因此,当您挪用Double bobble = bar.method1()时,X应该计较为extends Foo< Bar,但编译器抉择删除此参数,由于它未被行使.

当您明晰指定要领参数时,编译器必需搜查它们的正确性并按预期失败.

假如您变动这些要领中的任何一个以接管范例X的参数,那么您将不会获得这种恍惚的环境,由于您将为编译器提供一些信息,用于确定现实的X.

当Eclipse编译器基础没有表现任何错误时,Eclipse有几个这样的错误,可是javac开始诉苦不正确的要领挪用.停止此类错误的最佳要领是行使显式参数,在这种环境下,大大都编译器的举动险些沟通.因此,假如您对显式参数有题目,最好从头计划您的类.

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读