铸造嵌套泛型类型

时间:2021-02-04 00:58:24

标签: java generics

我知道在 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:

illegal

1 个答案:

答案 0 :(得分:1)

我不知道你用什么工具来编译这个,但我没有找到一个 jdk 来编译这个,从 816

这是非法的:

List<? extends List<Number>> list3 = new ArrayList<>();
List<List<Double>> list4 = (List<List<Double>>) list3;

出于显而易见的原因。 ? extends List<Number 不可能是 List<Double> 的超类型。

相关问题