&#34;警告:[未选中]未经检查的演员&#34;将Object转换为ArrayList <string []> </string []>时

时间:2015-03-05 08:28:03

标签: java generics arraylist casting java-8

奇怪的情况 - 下面是代码:

ArrayList<String[]> listArr = new ArrayList<>();
Object[] obj = new Object[]{"str", listArr};

String str = (String) obj[0];//OK
ArrayList<String[]> list = (ArrayList<String[]>) obj[1];//warning: [unchecked] unchecked cast

构建项目时(在项目属性中使用编译器选项-Xlint:unchecked),我收到一条警告:

  

警告:[未选中]未经检查的演员                          ArrayList list =(ArrayList)obj [1];
required:ArrayList
找到:   对象

但是以相同的方式构建String是可以的。这有什么问题?

3 个答案:

答案 0 :(得分:5)

这是因为编译器无法验证列表级别的内部类型,因此您需要先验证列表。并且内部类型单独。

而不是ArrayList<String[]> list = (ArrayList<String[]>) obj[1];

应该是 ArrayList<?> list = (ArrayList<?>) obj[1];

答案 1 :(得分:2)

这是因为如果您尝试将Integer转换为String,您将在运行时获得ClassCastException。但是这里不会有ClassCastException:

    ArrayList<Integer[]> listArr = new ArrayList<>();
    ArrayList<String[]> list = (ArrayList<String[]>) obj[1];

答案 2 :(得分:2)

编译器抱怨

ArrayList<String[]> list = (ArrayList<String[]>) obj[1]

因为强制转换是运行时检查。因此,在运行时,ArrayList<String[]>可能是ArrayList<Whatever[]>,因为obj的类型未知。