List[]提取元素必须谨慎,因其每个元素是类型未知的List,只能安全读取为Object且不可写入(除null),强转易致ClassCastException。
[]` 在实际提取元素时怎么避免类型转换报错">
无界通配符数组 List>[] 本身不是常见写法,也容易引发混淆——它并不是“装了各种泛型列表的数组”,而是“一个数组,每个元素是类型未知的 List”。实际使用中,**提取元素时根本无法安全转型为具体类型(如 String 或 Integer)**,因为编译器完全不知道每个 List> 里到底存的是什么。这不是操作技巧问题,而是设计限制:它只允许读取为 Object,且不能向其中写入(除 null 外)。
List>[] 提取元素必须谨慎数组是协变的(List<string>[]</string> 可赋值给 List>[]),但泛型是不变的;而 List>[] 的每个元素仍是 List>,其内部类型在运行时已被擦除,且编译期拒绝任何假设性转型。
List> list = listArray[0]; 合法,但 list.get(0) 只能赋给 Object 类型变量String s = (String) list.get(0); 编译通过但极可能运行时报 ClassCastException
List>[] 无法用 instanceof 判断内部元素类型(泛型擦除)核心原则:不强转,靠契约或结构信息规避风险。
Object 即可for (List<?> list : listArray) {<br> for (Object item : list) {<br> System.out.println("item: " + item); // 安全,不转型<br> }<br>}
Number 子类,声明为 List extends Number>[],则 get() 返回值可安全转为 NumberList<? extends Number>[] nums = ...;<br>Number n = nums[0].get(0); // 编译通过,类型安全
record TypedList<T>(List<T> list, Class<T> type) {}<br>TypedList<String>[] typedArray = ...;<br>String s = typedArray[0].list().get(0); // 直接获得 String,无需转型
这些看似“能跑通”的写法,本质危险且不可靠:
立即学习“Java免费学习笔记(深入)”;
list.get(i) 做强制类型转换((String)、(Integer) 等)getGenericReturnType 对数组元素无效)List>[] arr = new List>[10] 后,再尝试 arr[0] = new ArrayList<string>()</string> —— 编译报错(泛型数组创建受限,需用 @SuppressWarnings("unchecked"),但会失去类型检查)本质上,List>[] 是个信号:设计上已放弃类型精确性。真需要混合类型又保证安全,应改用泛型容器(如 List<List<?>>)或明确分层抽象,而不是靠转型硬扛。