被Java泛型混淆需要强制转换
我对以下代码感到困惑:
import java.util.ArrayList; import java.util.LinkedList; import java.util.List; public class GenericsTest<T extends List> { public void foo() { T var = (T) new LinkedList(); } public static void main(String[] args) { GenericsTest<ArrayList> gt1 = new GenericsTest<ArrayList>(); gt1.foo(); System.out.println("Done"); } } 无论我传递给构造函数的Type参数是什么,T的运行时类型似乎都是java.util.List. 那么为什么编译器在分配var时需要转换为T?它不应该在编译时知道LinkedList可以分配给List吗? 我理解代码是假的,我理解为什么它在运行时工作,即使它看起来不应该.令我困惑的部分是为什么编译器要求我在进行赋值时键入(T)?然而,如果没有伪造的话,它可以很好地编译. 据推测,编译器理解擦除.看起来编译器应该能够在没有强制转换的情况下编译代码. 解决方法
海报在评论中问道,
这个演员阵容不会失败.但编译器警告说,这段代码会设置一个时间炸弹,以便在ClassCastException的其他地方爆炸. 在该示例中,没有理由使用泛型,因为API都没有使用类型变量T.请查看更真实的泛型应用程序. public class GenericsTest<T extends List> { 3 public T foo() { 4 T var = (T) new LinkedList(); 5 return var; 6 } 8 public static void main(String... argv) { 9 GenericsTest<ArrayList> gt1 = new GenericsTest<ArrayList>(); 10 gt1.foo(); 11 System.out.println("Test one okay"); 12 ArrayList<?> list = gt1.foo(); 13 System.out.println("Test two okay"); 14 } } 在第12行抛出ClassCastException .ClassCastException,没有强制转换?调用代码完全正确.无效的强制转换(bug)位于调用方法的第4行.但是这个例外是在某个时间和地点提出的. Java泛型的目的是确保代码是类型安全的.如果所有代码都是在没有“未选中”警告的情况下编译的,那么保证在运行时不会引发ClassCastException.但是,如果您所依赖的库写得不正确,就像这个例子一样,承诺就会被破坏. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 新手使用MindFusion.Diagramming for WinForms中常见问题集
- java – 在Hadoop Map-Reduce中,任何类在排序之后和分区之前
- java – 语言级别的线程
- java – 上个月的最后一个工作日与LocalDate
- java-8 – Java 8:尽管避免了终端操作,但请参阅“流已经被
- 详解SpringBoot文件上传下载和多文件上传(图文)
- 36个Android开发常用代码片段
- 详解Spring Boot 使用slf4j+logback记录日志配置
- java – 在JPanel之间切换
- java – Jax-ws,spring和SpringBeanAutowiringSupport