19

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

我在 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;
}

这是问题所在:

当我使用调用此方法时

getResultAsMap(query, new HashMap<String,Object>(ImmutableMap.of("gciList",gciList)));

效果很好。

但是当我这样做时

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

编译器生气地说

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

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

4

4 回答 4

35

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

Map<String,Integer> map = Maps.newHashMap()

代替

Map<String,Integer> map = new HashMap<String,Integer>()

使您不必键入<String,Integer>两次。在 Java 7 中,菱形运算符允许您使用

Map<String,Integer> map = new HashMap<>()

所以该方法是多余的。

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

于 2012-10-31T08:22:21.370 回答
4

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

在类型推断出现在 java 之前,大部分好处已经消失了。(耶)但我想知道任何性能差异。这是代码google.common.collect.maps

  /**
   * Creates a <i>mutable</i>, empty {@code HashMap} instance.
   *
   * <p><b>Note:</b> if mutability is not required, use {@link
   * ImmutableMap#of()} instead.
   *
   * <p><b>Note:</b> if {@code K} is an {@code enum} type, use {@link
   * #newEnumMap} instead.
   *
   * @return a new, empty {@code HashMap}
   */
  public static <K, V> HashMap<K, V> newHashMap() {
    return new HashMap<K, V>();
  }

它的代码相同。

于 2015-11-06T20:09:33.220 回答
3

这里的问题是您的方法需要Map<String, Object>,但这实际上并不是您想要的。您想要任何类型的值MapString键。那不是,是。Map<String, Object>Map<String, ?>

于 2012-10-31T18:45:51.290 回答
0

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

“Map”的确切类型是什么 - 它真的是 java.util.Map 和 HashMap 的确切类型 - 它真的是 java.util.HashMap 吗?这里似乎有一个不匹配。

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

于 2012-10-31T08:10:23.453 回答