【发布时间】:2021-02-04 00:58:24
【问题描述】:
我知道在 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:
【问题讨论】:
-
检查java中协变和逆变的概念。这篇文章可能会有所帮助:dzone.com/articles/covariance-and-contravariance
-
List<Double>不是List<Number>的子类型,所以我们知道List<? extends List<Number>>绝对不是List<List<Double>>。从前一种类型到后一种类型的转换原则上可以在编译时被证明是不正确的。您的编译器可能无法识别,或者它只是选择警告而不是发出错误。这可能构成编译器错误。 -
哈?什么
javac版本? -
@Eugene 这是使用 javac 1.8.0_144。添加了未经检查的强制转换警告的屏幕截图。
-
这不是
javac。尝试从你的终端编译同样的东西。