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.
但是这使得使用该方法失败了)
这里的问题是你的方法采用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以接受接口,而不是具体的实现。