Maps.newHashMap与新HashMap返回的HashMap

Aru*_*nan 15 java collections spring guava

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

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

public Map<String,Object> getResultAsMap(String sql, Map<String,Object> 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;
}
Run Code Online (Sandbox Code Playgroud)

这是问题所在:

当我用这个方法调用时

getResultAsMap(query, new HashMap<String,Object>(ImmutableMap.of("gciList",gciList)));
Run Code Online (Sandbox Code Playgroud)

它很棒.

但是当我这样做的时候

getResultAsMap(query, Maps.newHashMap(ImmutableMap.of("gciList",gciList)));
Run Code Online (Sandbox Code Playgroud)

编译器不高兴说

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

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

art*_*tol 32

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

Map<String,Integer> map = Maps.newHashMap()
Run Code Online (Sandbox Code Playgroud)

代替

Map<String,Integer> map = new HashMap<String,Integer>()
Run Code Online (Sandbox Code Playgroud)

使您不必输入<String,Integer>两次.在Java 7中,钻石运算符允许您使用

Map<String,Integer> map = new HashMap<>()
Run Code Online (Sandbox Code Playgroud)

所以这个方法是多余的.

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

  • 也许值得链接和引用Guava的JavaDocs:http://google.github.io/guava/releases/23.6-jre/api/docs/com/google/common/collect/Maps.html#newHashMap-- _"注意事项Java 7及更高版本:此方法现在是不必要的,应该被视为已弃用.而是直接使用HashMap构造函数,利用新的"菱形"语法."_ (4认同)