嵌套的java集合泛型

发布于 2024-11-09 00:07:24 字数 978 浏览 0 评论 0原文

我想调用一个像这样定义的方法

<T> void foo(Class<? extends Collection<T>>)

,但是编译器无法让我通过

foo(ArrayList<Integer>.class);

获取泛型类型的类型类的语法是什么?

我正在实现常见的情况,我有一个

Map<Key, Collection<Value>>

并且想要在集合中插入一个值。如果该集合不存在,则应创建一个新集合并将值插入其中。 到目前为止,我有以下代码,但带有类型安全警告:

public static <K, V, C extends Collection<V>> boolean addToMappedCollectionNotNull(Map<K, C> aMap, K key, V element, Class<? extends Collection> type) {
    C collection = aMap.get(key);
    if (collection == null) {
        try {
            collection = (C)type.newInstance();
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        } catch (InstantiationException e) {
            throw new RuntimeException(e);
        }
        aMap.put(key, collection);
    }

    return collection.add(element);
}

I'd like to call a method defined like

<T> void foo(Class<? extends Collection<T>>)

but there is no way the compiler let me pass

foo(ArrayList<Integer>.class);

What is the syntax to get the type class of a generic type?

I am implementing the common case where I have a

Map<Key, Collection<Value>>

and want to insert a value in the collection. If the collection does not exist it should create a new one and insert the value in it.
So far I have the following code, but with type safety warnings:

public static <K, V, C extends Collection<V>> boolean addToMappedCollectionNotNull(Map<K, C> aMap, K key, V element, Class<? extends Collection> type) {
    C collection = aMap.get(key);
    if (collection == null) {
        try {
            collection = (C)type.newInstance();
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        } catch (InstantiationException e) {
            throw new RuntimeException(e);
        }
        aMap.put(key, collection);
    }

    return collection.add(element);
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

束缚m 2024-11-16 00:07:24

正如 Boris 所说,您可能正在寻找 MultiMap。但是,如果您认为必须传输类型信息 超级类型令牌 是一个解决方案。 Guice 有一个 TypeLiteral 实现您可以查看。

As Boris said you're probably looking for a MultiMap. But if you think that you have to transport the type information the super type token is a solution. Guice has a TypeLiteral implementation you can look at.

近箐 2024-11-16 00:07:24

使用 Google 的 Guava 库也可以实现相同的目标。有一个接口 Multimap< ;K, V> 将值集合 V 与键 K 相关联。

类似于Map的集合,但是
它可以关联多个值
用一把钥匙。如果您调用 put(K, V)
两次,使用相同的密钥,但是
不同的值,多​​重映射
包含从键到两者的映射
值。

MultimapListMultimapSetMultimapSortedSetMultimap 实现,涵盖值集合的所有可能需求V。

Same goal can be achieved using Google's Guava library. There's an interface Multimap<K, V> which associates a collection of values V to a key K.

A collection similar to a Map, but
which may associate multiple values
with a single key. If you call put(K, V)
twice, with the same key but
different values, the multimap
contains mappings from the key to both
values.

Multimap is implemented by a ListMultimap, SetMultimap and SortedSetMultimap covering all possible needs for the collection of values V.

安静被遗忘 2024-11-16 00:07:24

foo(ArrayList.class);

您无法获取参数化类型的 class,因为存在 没有确切的运行时类型表示

您将不得不重新设计它,以免将如此多的逻辑放在一个地方。也许可以将测试 null Collection 的部分与在不同位置(例如工厂)创建集合的部分分开。

foo(ArrayList.class);

You cannot get the class of a parameterized type because there is no exact runtime type representation.

You will have to re-design this to not put so much logic in one place. Maybe separate the part out that tests for a null Collection and the part the creates one in a different place, like a Factory.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文