我遇到一个有趣的问题,我从一些包含CustomObject的第三方API调用中获取原始列表,并将该列表保存到String类型的genric列表中。
List<String> strList = getCustomObjectList();//This is third part API
which resturn raw List
现在我想获得列表元素
String myStrValue = strList.get(0);
这里我得到的是异常
java.lang.ClassCastException: com.some.CustomObject无法强制转换为 java.lang.String中
现在我很想知道两件事
Genrics是编译时类型检查的概念,然后它是如何在运行时抛出异常的?
如何在这种情况下完成运行时类型转换?
答案 0 :(得分:7)
在编译时,编译器会向您发出有关您正在进行的不安全分配的警告(将原始List
分配给List<String>
变量),但接受该分配是为了向后兼容(第3版)包含getCustomObjectList()
方法的派对API可能是在Java 5中引入泛型之前编写的。
在运行时strList.get(0)
会返回Object
,但由于Object
类型的String
,List<String>
会投放到strList
。执行转换的代码由编译器在编译时添加,但仅在运行时执行转换,如果strList.get(0)
的运行时类型不是String
,则抛出异常