"Warning: [unchecked] unchecked cast" 将 Object 转换为 ArrayList<String[]>

"Warning: [unchecked] unchecked cast" when casting Object to 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),我收到一个警告:

warning: [unchecked] unchecked cast
ArrayList list = (ArrayList) obj[1];
required: ArrayList
found: Object

但以同样的方式转换 String 是可以的。这里有什么问题?

这是因为如果您尝试将 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 的类型是未知的。

这是因为编译器无法验证list级别的内部类型,所以需要先对list进行验证。以及单独的内部类型。

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

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