gpt4 book ai didi

java - 管理集合映射的通用方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:23:04 26 4
gpt4 key购买 nike

在我正在开发的应用程序中,我使用了几个将字符串关联到元素集合的映射,例如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 传递 Lists 的标记)。

但是,如果我尝试这样使用它:

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 的此类实例.有没有更好的方法来执行这样的通用方法?

最佳答案

您可以使用第三方库吗?你基本上是在重新发明 Guava's Multimap -- ListMultimap<String, String>SortedSetMultimap<String, Object>是你的两个例子。提供了一堆实现——最值得注意的是,对于你的情况, ArrayListMultimap TreeMultimap .

也就是说,传递一个显式工厂对象通常更容易:

interface Supplier<T> { 
T get();
}

void putIntoCollection(Map<K, Set<V>>, K, V, Supplier<Set<V>> emptySetSupplier);

关于java - 管理集合映射的通用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9759839/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com