"Warning: [unchecked] unchecked cast"将对象强制转换为 ArrayList<String[]>



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

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]
必需:ArrayList
已找到:对象

但是用同样的方法铸造字符串是可以的。这里的问题是什么?

这是因为编译器无法在列表级别验证内部类型,因此需要首先验证列表。以及内部类型。

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

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

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

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

编译器抱怨

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

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

最新更新