"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];
奇怪的情况 - 下面是代码:
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];