Oracle JDK和Eclipse JDT编译器纷歧致!哪个不正确地编译?不寻
我有一段代码在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开始诉苦不正确的要领挪用.停止此类错误的最佳要领是行使显式参数,在这种环境下,大大都编译器的举动险些沟通.因此,假如您对显式参数有题目,最好从头计划您的类. (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |