【发布时间】:2021-12-15 02:59:25
【问题描述】:
考虑以下 sn-p:
List<Double> doubleList = null;
List<Integer> integerList = null;
List<Number> numberList = null;
//expression:1
List<? super List<? super Integer>> superDoubleList = Arrays.asList(doubleList, integerList,numberList);
//expression:2
//here doubleList will cause compilation error
List<? extends List<? super Integer>> extendsDoubleList = Arrays.asList(integerList,numberList);//doubleList
- 在这里,我试图了解如何解释这两个语句
-
表达式:1
- 这里我们说 RHS 上的列表必须是列表的所有元素都满足条件
? super List<? super Integer> - 但是
doubleList/integerList/numberList无论如何都不能满足这个条件 - 因为我们期望一个类型是List<? super Integer>的超类型。 - 为什么这里没有编译错误?
- 这里我们说 RHS 上的列表必须是列表的所有元素都满足条件
-
表达式:2
- 这里我们期望 RHS 上的元素必须是
subtype of List<? super Integer> - 所以
doubleList直观上可以看成是可以满足条件的候选人。 -
如果我在
Arrays.asList表达式中包含doubleList,为什么仍然会出现编译错误?。
- 这里我们期望 RHS 上的元素必须是
-
表达式:1
不确定我是否以正确的方式解释了这些表达式 - 从逻辑上讲它似乎不符合我上面给出的解释可能有什么问题?
【问题讨论】:
-
与其考虑超类型和子类型,不如将
? super和? extends考虑为consumers and producers,这样更容易推理。 -
我没有收到编译器错误。用JDK8、JDK11、JDK17测试。所以我投票决定关闭。
-
@Seelenvirtuose 您需要(我引用)“在
Arrays.asList表达式中包含doubleList”以获取编译器错误。 -
@Sweeper Arrgh。我的错。过失。
标签: java generics jls bounded-wildcard unbounded-wildcard