web-dev-qa-db-ja.com

Maps.newHashMapと新しいHashMapによって返されるHashMap

私は初めてグアバを試していますが、本当に素晴らしいと思います。

Springjdbcテンプレートでいくつかのパラメーター化された取得クエリを実行しています。 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>>)

私は何か間違ったことをしているのですか、それともこの苦情の理由は何でしょうか?

15
Arun Manivannan

これは型推論の失敗です。 _Maps.newHashMap_は、静的にパラメーター化されたメソッドです。それはあなたが使用することを可能にします

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

の代わりに

_Map<String,Integer> map = new HashMap<String,Integer>()
_

_<String,Integer>_を2回入力する必要がなくなります。 Java 7では、ダイヤモンド演算子を使用すると、

_Map<String,Integer> map = new HashMap<>()
_

そのため、この方法は冗長になります。

型推論はメソッドパラメータでは機能しないため、質問に答えるには、_new HashMap_バージョンを使用してください。 (Maps.<String,Object>newHashMap()を使用することもできますが、それはメソッドを使用するポイントを無効にします)

32
artbristol

ここでの問題は、メソッドがMap<String, Object>を取ることですが、それは実際には必要なものではありません。 any種類の値にMapキーのStringが必要です。それはMap<String, Object>ではなく、Map<String, ?>です。

3
ColinD

ここに遅い答えを追加する:

型推論が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>();
  }

その同じコード。

3
ford prefect

更新:コンパイラエラーを読み間違えました-申し訳ありません!私の答えを自由に削除してください!

「マップ」の正確なタイプは何ですか-それは本当にJava.util.Mapであり、HashMapの正確なタイプです-それは本当にJava.util.HashMapですか?ここに不一致があるようです。

元の「回答」:明らかに、Maps.newHashMapはMapインターフェースの実装を返しますが、これは不明ですが、getResultAsMapにはHashMapが必要です(これは異常な要件です)。 getResultAsMapは、具体的な実装ではなく、インターフェイスを受け入れるようにリファクタリングする必要があります。

0
Sebastian