java – 添加泛型参数时未选中的强制转换警告
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 添加泛型参数时未选中的强制转换警告,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1288字,纯文字阅读大概需要2分钟。
内容图文
![java – 添加泛型参数时未选中的强制转换警告](/upload/InfoBanner/zyjiaocheng/768/db3140f520f84096bd3bb2cff8c9130b.jpg)
以下Java代码不会生成未经检查的强制转换警告(使用Eclipse编译器对Java 8进行测试):
class Parent<T> {}
class Child<T> extends Parent<T> {}
class Test {
<T> void test() {
Parent<T> p = new Child<T>();
// cast accepted by compiler:
Child<T> cast = (Child<T>)p;
}
}
所以我理解,如果p既是父< T>,那么编译器必须以某种方式得到它. (通过编译时类型)和Child(通过运行时转换),然后可以安全地假设它是Child< T>因为Child在其extends子句中传递了它的类型参数.
但是,以下类似的代码会生成未经检查的强制转换警告:
class Parent<T> {}
class Child<T, U> extends Parent<T> {}
class Test {
<T, U> void test() {
Parent<T> p = new Child<T, U>();
// cast considered unsafe by compiler:
Child<T, ?> cast = (Child<T, ?>)p;
}
}
然而,考虑第一个示例安全的原因也应该适用于此!如果p是父< T>然后它应该是一个Child< T,?>,给出Child’s extends子句!
(请注意,我不会在转换中包含U,因为在编译时或运行时都无法检查它.)
有没有办法转换为具有附加参数的子类型,没有警告?
解决方法:
正如我在评论中所说,这两个演员在Oracle的Java 1.8.0_112编译器中工作,所以如果你愿意,可能是编译器错误或限制.
我猜两个演员都不应该是不安全的,假设Subclassing类是正确的(即实例确实是Child),它必须是真的,它与Child< T,?>兼容.如果是父< T>.相反,如果你试图把它投射到像Child< U,V>这样的东西上,它将不起作用(即产生警告).其中U不能保证是T或V是除了?之外的任何东西,因为有Child是父< T>不一定是Child< U,V>.
内容总结
以上是互联网集市为您收集整理的java – 添加泛型参数时未选中的强制转换警告全部内容,希望文章能够帮你解决java – 添加泛型参数时未选中的强制转换警告所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。