【发布时间】:2015-03-09 12:37:17
【问题描述】:
假设您有一个List 的数字。 List 中的值可以是 Integer、Double 等类型。当您声明这样的 List 时,可以使用通配符 (?) 或不使用通配符来声明它。
final List<Number> numberList = Arrays.asList(1, 2, 3D);
final List<? extends Number> wildcardList = Arrays.asList(1, 2, 3D);
所以,现在我想使用Collectors.toMap 将stream 超过List 和collect 全部转换为Map(显然,下面的代码只是说明问题的示例)。让我们从流式传输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类型的变量号
从编译器错误可以看出,lambda 中的number 被视为Object 而不是Number。
那么,现在来回答我的问题:
- 在收集
List的通配符版本时,为什么它不像List的非通配符版本那样工作? - 为什么 lambda 中的
number变量被认为是Object而不是Number?
【问题讨论】:
标签: java generics lambda java-8 collectors