gpt4 book ai didi

java - 在 HashMap 中使用嵌套泛型类型

转载 作者:行者123 更新时间:2023-12-02 02:06:07 27 4
gpt4 key购买 nike

我正在寻找一种方法,让 MapMap 的类型中具有通用类型,然后使用键和正确的类型检索它们。例如:

private final <T> Map<A<T>,B<T>> map = new HashMap<>();

public <T> B<T> getB(final A<T> a) {
return map.get(a);
}

使用这个的一个例子是:

final A<String> a = ...;
final B<String> b = getB(a);

这种情况是否存在或者有任何解决方法吗?

编辑:我知道我可以通过强制转换来解决这个问题,但我想知道是否有一种更优雅的方法,不需要我强制转换我检索到的每个值。

最佳答案

您不能以这种方式声明 map 。基本上,Java 没有为此提供足够表达的类型系统。

但幸运的是,该语言以强制转换的形式提供了使用类型系统的逃生口。基本上,强制转换是一种提供编译器没有的类型信息的方法;然而,您有责任确保它实际上类型安全。

首先,声明具有通配符类型的 map :

private final Map<A<?>,B<?>> map;

然后,仅将确实满足约束的键/值对放入映射中:

<T> void put (A<T> key, B<T> value) {
map.put(key, value);
}

然后当你再次取出元素时进行强制转换:

@SuppressWarnings("unchecked") // Safe
<T> B<T> get(A<T> key) {
return (B<T>) map.get(key);
}

重点是你可以比编译器更了解类型。只要您注意只放入可安全施放的对,那么施放它们就是安全的。 (您还需要确保 equals 方法考虑到类型,因此 A<T> 不等于 A<S> 除非 S == T )。

这基本上是一个“类型安全的异构容器”,如Effective Java(第三版中的第 33 项)中所述。

I am wondering if there is a more elegant way that does not require me to cast every value I retreive.

一方面,您实际上并没有在 get 中进行转换。运行时方法:这就是未经检查的强制转换的含义。

另一方面,泛型引入了负载的强制转换 - 基本上泛型只是避免手动插入强制转换的一种方法。因此,如果 Actor 出现问题(例如性能),您已经在很多地方观察到了这一点。

套用库布里克的话:别担心,热爱 Actor 阵容。

关于java - 在 HashMap 中使用嵌套泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50775090/

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