在将Object转换为ArrayList 时,“警告:未选中”

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

ArrayList listArr = new ArrayList(); Object[] obj = new Object[]{"str", listArr}; String str = (String) obj[0];//OK ArrayList list = (ArrayList) obj[1];//warning: [unchecked] unchecked cast 

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

警告:[未选中]未经检查的强制转换
ArrayList list =(ArrayList)obj [1];
required:ArrayList
发现:对象

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

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

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

它应该是ArrayList list = (ArrayList) obj[1];

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

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

编译器抱怨

 ArrayList list = (ArrayList) obj[1] 

因为强制转换是运行时检查。 因此,在运行时,您的ArrayList可以是ArrayList ,因为obj的类型未知。