我有一个包含List的数据库。这是使用从通用列表返回的数据设置的。但是当我尝试迭代列表时,我得到一个类强制转换异常。以下是结构,
class DataBean {
List<Integer> data;
//getter and setter
}
class DataSetter {
public <E> List<E> operate() {
List <E> returnList = new ArrayList<E>();
//Compute
return returnList;
}
}
class Main {
main() {
List<Integer> current = dataSetter.operate();
dataBean.setM(current); //works as expected
List <Integer> temp = dataBean.getM();//works as expected
System.out.println(temp);//prints as expected
for(int i : temp) { //exception java.lang.String cannot be cast to java.lang.Integer
System.out.println(i);
}
}
}
为什么我会看到这样的例外?如果返回的列表不是整数列表,它是否应该在尝试将其设置为类变量时生成异常?如果存在类型不匹配,如何设置和返回类变量?为什么只有当我尝试迭代列表时才会看到这个?
答案 0 :(得分:0)
如果返回的列表不是整数列表,则它应该生成异常
实际上,没有。
在Java中,泛型使用类型擦除。这意味着泛型的类型检查是在编译时完成的,但不是在运行时完成的。在运行时,List<Object>
或List<String>
之间没有区别。实际上,它们都等于旧的,未参数化的List
。
所以,你可以做类似
的事情List<String> myList1 = new ArrayList<String>();
myList1.add("HELLO");
List myList2 = myList1;
List<Integer> myList3 = (List<Integer>) myList2;
并且你得到的只是编译时的警告(并且警告是因为它无法确保强制转换是真的有效,并且你在运行时不会得到ClassCastException。)