jdk8 lambda 表达式推断问题

2019-01-15 16:52:03 +08:00
 beijiaxu

目前用的是 jdk8 144 版本,写了如下一个方法

Map<String, Object> map = new HashMap<>();
map.put("a", new ArrayList<String>());

methodA((Collection) map.get("a")).stream()
    .forEach(p -> System.out.println(p.getClass()));
methodA((Collection<String>) map.get("a")).stream()
    .forEach(p -> System.out.println(p.getClass()));

如下为 methodA

List<String> l = new ArrayList<>();
l.add("a");
l.add("b");
return l;

两端输出都是 String 类型, 然而推断类型的时候,第一个调用的参数 p 为 Object,第二个为 String。。。

3607 次点击
所在节点    Java
23 条回复
beijiaxu
2019-01-17 16:15:29 +08:00
@WangYanjie 我又重新写了下例子,感觉都误导到大家了。。。
j2gg0s
2019-01-18 00:47:26 +08:00
@beijiaxu 我发现我有两个号,另一个叫 WangYanjie
昨天是我发现我后面不能自圆其说了,今天仔细看了下。
直接的原因是因为:调用 methodA 时如果有 unchecked conversation,会导致返回类型为定义返回类型的擦除后类型。
所以 methodA(Collection<String>) 返回 List<String>; methodA(Collection) 返回 List ;
具体可以看 https://segmentfault.com/a/1190000017935037,我整理在此了
beijiaxu
2019-01-18 13:52:35 +08:00
@j2gg0s 谢谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/527291

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX