假设你有一个List
数字。中的值List
可以是 typeInteger
等Double
。当您声明这样的 aList
时,可以使用通配符 ( ?
) 或不使用通配符来声明它。
final List<Number> numberList = Arrays.asList(1, 2, 3D);
final List<? extends Number> wildcardList = Arrays.asList(1, 2, 3D);
所以,现在我想stream
通过使用(显然下面的代码只是说明问题的一个示例)。让我们从流式传输开始:List
collect
Map
Collectors.toMap
numberList
final List<Number> numberList = Arrays.asList(1, 2, 3D, 4D);
numberList.stream().collect(Collectors.toMap(
// Here I can invoke "number.intValue()" - the object ("number") is treated as a Number
number -> Integer.valueOf(number.intValue()),
number -> number));
但是,我不能在wildcardList
:
final List<? extends Number> wildCardList = Arrays.asList(1, 2, 3D);
wildCardList.stream().collect(Collectors.toMap(
// Why is "number" treated as an Object and not a Number?
number -> Integer.valueOf(number.intValue()),
number -> number));
编译器在调用时抱怨number.intValue()
以下消息:
Test.java:找不到符号
符号:方法 intValue()
位置:java.lang.Object 类型的变量号
从编译器错误中,很明显number
lambda 中的 被视为 anObject
而不是 a Number
。
所以,现在我的问题:
- 在收集 的通配符版本时
List
,为什么它不像非通配符版本的List
? - 为什么
number
lambda 中的变量被认为是 aObject
而不是 aNumber
?