私が開発しているアプリケーションでは、文字列を要素のコレクションに関連付けるいくつかのマップを使用します。 Map<String, List<String>>
,Map<String, SortedSet<Object>>
。多くの場合、特定のキーによって与えられたコレクション内の要素を追加/削除したり、マップ内に新しいエントリを作成したり作成したりする単純な関数が必要です。コレクションのマップを管理する一般的な方法
私はエフェクトのいくつかの一般的なメソッドを実装しましたが、putIntoCollection()
メソッドは私にいくつかの問題を与えています。すべての警告を上昇しない私の実装では、以下の通りです:
public static <K, V, C extends Collection<V>> void putIntoCollection(
Map<K, C> map, K key, V value, Class<? extends C> collectionClass)
throws InstantiationException, IllegalAccessException {
C collection = map.get(key);
if (collection == null) {
collection = collectionClass.newInstance();
map.put(key, collection);
}
collection.add(value);
}
C
はCollection
の任意の型を指定でき、コレクションの種類を表し、Class<? extends C>
パラメータは私がする具象クラストークンを渡すことができます新しいC
のインスタンスを生成してください(例えば、のマップに対してArrayList
のトークンを渡してください)。
しかし、私はこのようにそれを使用しようとします
Map<String, Set<String>> tags;
String key, value;
MapUtilities.putIntoCollection(map, key, value, HashSet.class);
私はコンパイルエラーを取得:
The parameterized method <K, V, Set<V>>putIntoCollection(Map<K,Set<V>>, K, V, Class<? extends Set<V>>) of type MapUtilities is not applicable for the arguments (Map<K,Set<V>>, K, V, Class<HashSet>)
私はそれを期待している間、私はClass<HashSet>
引数を渡しているので、それが起こる理解をパラメータを持つSetクラス。しかし、私はClass
のインスタンスをどのように(または)取得できるのか分かりません。このような一般的な方法を実行するより良い方法はありますか?
私はライブラリを知らなかった。私は一般的に一般的なライブラリを使うのが好きではなく、よりコンパクトなアプローチが好まれます。それにもかかわらず、私は最初にそれらのメソッドを書くのを始めたときに問題を過小評価したと思います。私はMultimapsの使用を検討したり、使いやすいようにファクトリオブジェクトを使用したりします。好奇心のために、私はまだ "純粋な" Javaでその操作を表現する方法があるかどうかを知りたいです。 –
「純粋な」Javaでこれを行う良い方法は、私が記述したもの以外にはありません。つまり、あなたはこの質問に対する他の答えから、グアバがむしろソーシャルであることに気づいているかもしれないと言っています(基本的にオープンソースのGoogleのユーティリティライブラリです)。 (ディスクロージャー:私はGuavaチームにいる) –