Maps.newHashMap与新HashMap返回的HashMap

我第一次尝试番石榴,我发现它真的很棒。

我在Spring jdbc模板上执行几个参数化检索查询。 DAO( AbstractDataAccessObject )中的方法是这样的。 这里没问题。

 public Map getResultAsMap(String sql, Map parameters) { try { return jdbcTemplate.queryForMap(sql, parameters); } catch (EmptyResultDataAccessException e) { //Ignore if no data found for this query logger.error(e.getMessage(), e); } return null; } 

这是问题所在:

当我用这个方法调用时

 getResultAsMap(query, new HashMap(ImmutableMap.of("gciList",gciList))); 

它很棒。

但是当我这样做的时候

 getResultAsMap(query, Maps.newHashMap(ImmutableMap.of("gciList",gciList))); 

编译器不高兴说

The method getResultAsMap(String, Map) in the type AbstractDataAccessObject is not applicable for the arguments (String, HashMap<String,List>)

我做错了什么或者这个投诉的原因是什么?

这是类型推断失败。 Maps.newHashMap是一个静态参数化方法。 它允许你使用

 Map map = Maps.newHashMap() 

代替

 Map map = new HashMap() 

使您不必两次输入 。 在Java 7中,钻石运算符允许您使用

 Map map = new HashMap<>() 

所以这个方法是多余的。

要回答您的问题,只需使用new HashMap版本,因为类型推断不适用于方法参数。 (你可以使用Maps.newHashMap()但是这使得使用该方法失败了)

这里的问题是你的方法采用Map ,但实际上并不是你想要的。 您需要Map of String键到任何类型的值。 那不是Map ,它是Map

在这里添加一个迟到的答案

在类型推断到java之前,大部分好处都消失了。 (yay)但我想知道任何性能差异。 以下是google.common.collect.maps的代码

  /** * Creates a mutable, empty {@code HashMap} instance. * * 

Note: if mutability is not required, use {@link * ImmutableMap#of()} instead. * *

Note: if {@code K} is an {@code enum} type, use {@link * #newEnumMap} instead. * * @return a new, empty {@code HashMap} */ public static HashMap newHashMap() { return new HashMap(); }

它的代码相同。

更新:我误读了编译器错误 – 抱歉! 随意删除我的答案!

什么是“Map”的确切类型 – 它真的是java.util.Map和HashMap的确切类型 – 它真的是java.util.HashMap吗? 这里好像不匹配。

原始的“答案”:显然Maps.newHashMap返回Map接口的实现,这是未知的,但是getResultAsMap需要一个HashMap(这是一个不寻常的要求)。 应该重构getResultAsMap以接受接口,而不是具体的实现。