Arraylist <integer>和来自数据库类型不匹配异常的字符串</integer>

时间:2015-02-25 11:25:06

标签: java

我有一个包含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);
    }
  }
}

为什么我会看到这样的例外?如果返回的列表不是整数列表,它是否应该在尝试将其设置为类变量时生成异常?如果存在类型不匹配,如何设置和返回类变量?为什么只有当我尝试迭代列表时才会看到这个?

1 个答案:

答案 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。)