5

Apache Commons Collectionsライブラリの 4.0 リリースでは、ジェネリックのサポートが追加されました。コードを変換して利用するのに問題があります。

MultiValueMap文字列をキーとして、文字列のコレクションを値として受け取る が必要です。しかし:

  1. キーは挿入順序を保持する必要があります (したがって、a を装飾して多値マップを作成しますLinkedHashMap)
  2. 値はキーごとに一意である必要があり、挿入順序を保持する必要があります (したがって、値のコレクション型を a にしたいLinkedHashSet)。

私が得ることができる最も近いものは次のとおりです。

MultiValueMap<String, String> orderedMap = MultiValueMap.multiValueMap(
    new LinkedHashMap<String, Collection<String>>(), 
    LinkedHashSet.class
);

しかし、それはエラーを生成します:

multiValueMap(Map<K,? super C>, Class<C>)型 のメソッドMultiValueMapは引数に適用できません (LinkedHashMap<String,Collection<String>>, Class<LinkedHashSet>)

だから今、私はジェネリック地獄にいます。どんな提案でも大歓迎です。

バージョン 4.0 より前のバージョンでは、次のようにして実現しました。

MultiValueMap orderedMap = MultiValueMap.decorate(
    new LinkedHashMap<>(), 
    LinkedHashSet.class
);

単純!LinkedHashMap動作を装飾する を提供し、使用するMultiValueMapコレクションのタイプ ( LinkedHashSet) を値として指定します。しかし、and を呼び出すときにキャストする必要があるput()ためget()、4.0 で提供される新しい汎用バージョンを使用できるようにしたいと考えています。

4

2 に答える 2

5

Apache Commons Collections のメーリング リストを調べたところ、 のインターフェイスが不足していることがわかっているが、バージョン 4.1 で改良される予定であることが説明されました ( JIRA の問題と関連する議論については、こちらを参照してください)。MultiValueMap

したがって、将来的にはより良い解決策があるかもしれませんが、それまでの間、Rohit Jain が彼の回答で述べたように、いくつかの警告を抑制する必要があります。ただし、型安全性の重要な側面はMultiValueMap(カスタム コレクション型ではなく) のためであるため、これを実現する最も簡単な方法は次のとおりです。

@SuppressWarnings({ "rawtypes", "unchecked" })
MultiValueMap<String, String> orderedMap = 
    MapUtils.multiValueMap(new LinkedHashMap(), LinkedHashSet.class);

元の質問で使用しMapUtilsたより直接的な方法ではなく、ファクトリ メソッドの使用に注意してください。MultiValueMap

于 2014-04-01T03:20:10.527 に答える
1

Class<LinkedHashSet<String>>問題は、2 番目の引数としてa を渡す必要があることです。直接作成することはできません。キャストを行う必要があります。

これはうまくいきます:

@SuppressWarnings("unchecked")
MultiValueMap<String, String> orderedMap = 
           MultiValueMap.multiValueMap(
                new LinkedHashMap<String, Collection<String>>(), 
                (Class<LinkedHashSet<String>>)(Class<?>)LinkedHashSet.class
           );
于 2014-03-25T04:44:36.443 に答える