编译器在使用菱形时推断出的类型参数是什么?

时间:2019-06-18 17:47:46

标签: java generics

我想知道什么是编译器在创建List时会推断出的类型参数,并且其参数化类型受extendssuper子句的限制。

List<? extends Number> numbersList = new ArrayList<>(); List<? super Integer> integersList = new ArrayList<>();

2 个答案:

答案 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