Java 8 Streams:为什么 Collectors.toMap 对于带有通配符的泛型的行为不同?
假设您有一个数字。中的值可以是 类型 ,等等。当您声明此类时,可以使用通配符 () 或不使用通配符来声明它。List
List
Integer
Double
List
?
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: 找不到符号
符号: method intValue()
位置: 类型 java.lang.Object 的变量
从编译器错误中可以明显看出,lambda 中的 the 被视为 a 而不是 .number
Object
Number
所以,现在回答我的问题:
- 当收集 通配符版本的 时,为什么它不像 非通配符版本的 ?
List
List
- 为什么 lambda 中的变量被视为 a 而不是 a?
number
Object
Number