2012-01-30 55 views
8

为什么Map<String, ?> test = ImmutableMap.builder().build();无法编译,但Map<String, ?> test = ImmutableMap.<String, Object>builder().build();工作正常吗?为什么ImmutableMap.builder()。build()没有选择正确的类型参数?

error: incompatible types 
    Map<String, ?> test = ImmutableMap.builder().build(); 
               ^
    required: Map<String,?> 
    found: ImmutableMap<Object,Object> 

相信番石榴的提交意味着这个工作:与

第一个代码sniplet失败。

回答

16

这不是Guava的失败,而是Java解决泛型的方式,而这是我们无法控制的。 =(

相信我们:这是什么,我们就花了很多时间在这个issue,凯文提到,我们没有试图不到十五的方法试图让你没得得到它明确指定类型参数。

如果你只在ImmutableMap.builder().build()的情况感兴趣,那就是,在地图上没有条目...那么你应该使用ImmutableMap.of(),这不会有任何问题,搞笑仿制药:它只会工作

+0

这是可以在语言中修复的东西吗?也就是说,我们可以向Oracle提交错误报告吗? – Gili 2012-01-30 04:17:21

+0

不可能,我很害怕。如果他们没有将它与Java 7中的钻石运算符进行增强类型推断,我怀疑它们可以包含它。可能有些奇怪的边缘案例由于某种原因无法管理,但我不确定具体情况。 – 2012-01-30 04:24:39

+0

@Gili:我知道有一些工作可以改进Java 8的类型推断......这个_may_是可以用改进的规则推断出来的东西,我不确定。 – ColinD 2012-01-30 13:25:22

相关问题