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>2 回入力する必要がなくなります。Java 7 では、ダイヤモンド演算子を使用すると、

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

そのため、メソッドは冗長です。

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

于 2012-10-31T08:22:21.370 に答える
3

ここでの問題は、メソッドが取るというMap<String, Object>ことですが、それは実際にはあなたが望むものではありません。あらゆる種類の値に対するMapキーStringが必要です。それはそうではありません、それはです。Map<String, Object>Map<String, ?>

于 2012-10-31T18:45:51.290 に答える
0

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

「マップ」の正確なタイプは何ですか?それは本当にjava.util.Mapであり、HashMapの正確なタイプですか?それは本当にjava.util.HashMapですか? ここにミスマッチがあるようです。

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

于 2012-10-31T08:10:23.453 に答える