Eclipse ECJ接受此代码,javac不接受 – 谁是对的?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Eclipse ECJ接受此代码,javac不接受 – 谁是对的?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1938字,纯文字阅读大概需要3分钟。
内容图文
![Eclipse ECJ接受此代码,javac不接受 – 谁是对的?](/upload/InfoBanner/zyjiaocheng/822/65bdcb627a274afd815fc8b46a7350d8.jpg)
考虑以下returnsNull函数并使用泛型类型调用它:
public static <T> List<T> returnNull(Class<? extends T> clazz) {
return null;
}
public static void main( String[] args )
{
List<AtomicReference<?>> l = returnNull(AtomicReference.class);
}
Eclipse编译器在设置为Java 8时接受它,但Java 8中的javac拒绝它:
incompatible types: cannot infer type-variable(s) T
(argument mismatch; java.lang.Class<java.util.concurrent.atomic.AtomicReference> cannot be converted to java.lang.Class<? extends java.util.concurrent.atomic.AtomicReference<?>>)
潜在的差异似乎是给定两个参数化类型P1< T>. Eclipse和P2< T>,Eclipse允许从使用原始内部类型参数化的外部类型转换:P1< P2>.外部类型用内部类型的下界参数化,带有无界的通配符,如P1<?延伸P2<?>. javac没有.
这不仅仅是一个理论上的思考:如果这个代码被接受,它将解决我的generics filtering problem.
谁是对的?
解决方法:
在applicability inference期间,ECJ推断出< T>.到AtomicReference#RAW,让returnNull的签名显示为
List<AtomicReference#RAW> returnNull(Class<? extends AtomicReference#RAW>)
确切的步骤是:
>?Class< AtomicReference#RAW> →班级<?延伸T#0>?
> reduced to:
>?Class< AtomicReference#RAW> <:Class<?延伸T#0>?
>?AtomicReference#RAW< =?扩展T#0?
>?AtomicReference#RAW<:T#0?
> AtomicReference#RAW<:T#0
> resolved to:
> T#0 = AtomicReference#RAW
现在,传递Class< AtomicReference#RAW>类型的值没有问题.进入那个方法.
(后缀#RAW是原始类型的特定于实现的表示,为清楚起见,在此处再现).
编辑:在invocation type inference期间事情看起来不同:通过将目标类型添加到混合中,我们最终(在incorporation期间)使用以下约束:
>?AtomicReference#RAW<:AtomicReference<?>?
此约束应减少为FALSE,但ecj减少为TRUE.由此,拒绝该程序似乎是正确的答案.
我在欧洲法院提交了bug 528970进一步调查.
这有一些讽刺意味,因为javac has a long standing bug错误地假设T#RAW<:T< X>.出于兼容性原因,ECJ明确地将此错误复制到许多位置,但显然在一个特定的代码位置则相反:javac应用了ECJ检查兼容性的子类型.
编辑2:一年之后,似乎只有在0700及以后的JLS改进后,ECJ中的错误才能得到修复.
内容总结
以上是互联网集市为您收集整理的Eclipse ECJ接受此代码,javac不接受 – 谁是对的?全部内容,希望文章能够帮你解决Eclipse ECJ接受此代码,javac不接受 – 谁是对的?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。