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

标签 java dictionary generics hashmap

我正在寻找一种方法,让 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/

相关文章:

java - C++ 客户端与 Java 服务器之间的通信

java - 是否有可能使 Web 应用程序主动而不是被动?

python - 使用嵌套键查找字符串访问 python dict

c - 设计通用哈希

python - 使用通用 View 时模板不存在

Java 泛型和通配符 : How to make this code compile?

java - Hadoop:基于复合定界符拆分文本框类内容

java - Java 中的多个输入/输出流?

c - 如何在 C/C++ 中使用自动更正、自动完成、拼写检查功能实现字典

javascript - 使用 lodash 函数映射柯里化(Currying)过滤器