我知道在 Java 中将 List<Number>
转换为 List<Double>
是非法的,因为 List<Double>
不是 List<Number>
的子类型:
List<Number> list1 = new ArrayList<>();
List<Double> list2 = (List<Double>) list1; // inconvertible types
根据这种理解,我预计将 List<? extends List<Number>>
强制转换为 List<List<Double>>
也是非法的,因为我认为 List<Double>
不属于由List<Number>
。然而,这个转换实际上是有效的,带有一个未经检查的转换警告:
List<? extends List<Number>> list3 = new ArrayList<>();
List<List<Double>> list4 = (List<List<Double>>) list3; // unchecked cast warning, but legal
当上面的第一个强制转换是非法的时,我如何推理 List<Double>
属于 List<Number>
给出的类型系列?
在 Intellij 中使用 javac 1.8.0_144:
答案 0 :(得分:1)
我不知道你用什么工具来编译这个,但我没有找到一个 jdk
来编译这个,从 8
到 16
。
这是非法的:
List<? extends List<Number>> list3 = new ArrayList<>();
List<List<Double>> list4 = (List<List<Double>>) list3;
出于显而易见的原因。 ? extends List<Number
不可能是 List<Double>
的超类型。