我想知道什么是编译器在创建List时会推断出的类型参数,并且其参数化类型受extends
或super
子句的限制。
List<? extends Number> numbersList = new ArrayList<>();
List<? super Integer> integersList = new ArrayList<>();
答案 0 :(得分:0)
它可以推断出左侧的类型。
List
也等同于List<Object>
,因此可以推断为ArrayList<Object>
。
Map<String, OutputStream> map = new HashMap<>();
会推断为<String, OutputStream>
编辑:您更新了问题,但仍然适用,左侧将等于右侧,因为必须将它们设置为相等
答案 1 :(得分:0)
这在§18 of the JLS中有详细讨论。
在您的情况下,List<? extends Number>
将替换为List<Number>
,因为Number
是上限,而List<? super Number>
将替换为List<Object>
,因为{{ 1}}是上限。您可以通过快速测试来验证这一点,我在Ideone
要讨论为什么这很有用,可以看一下PECS mnemonic