作者:手机用户2502895987 | 来源:互联网 | 2022-12-14 11:54
我正在寻找一种方法,在Map
类型中使用泛型Map
类型,然后使用键和正确类型检索那些类型.例如:
private final Map,B> map = new HashMap<>();
public B getB(final A a) {
return map.get(a);
}
使用它的一个例子是:
final A a = ...;
final B b = getB(a);
这是以任何方式存在还是有任何解决方法?
编辑:我知道我可以通过铸造东西解决它,但我想知道是否有一种更优雅的方式,不需要我投射我所追溯的每一个价值.
1> Andy Turner..:
您无法以这种方式声明地图.基本上,Java没有足够表达的类型系统.
但幸运的是,语言提供了从使用类型系统,在形式的逃生舱口石膏.基本上,强制转换是一种提供编译器没有的类型信息的方法; 然而,责任在于你,以确保它实际上是类型安全的.
首先,使用通配符类型声明地图:
private final Map,B>> map;
然后,只放键/值对到其中的地图做满足约束条件:
void put (A key, B value) {
map.put(key, value);
}
然后当你再次获得元素时施放:
@SuppressWarnings("unchecked") // Safe
B get(A key) {
return (B) map.get(key);
}
关键是你可以比编译器更多地了解类型.如果您只注意安装可安全浇注的对,则可以安全地进行铸造.(您还需要确保equals
方法将类型考虑在内,因此除非A
等于否).A
S == T
这基本上是"类型安全的异构容器",如Effective Java(第3版中的第33项)中所述.
我想知道是否有一种更优雅的方式,不需要我投出我所追溯的每一个价值.
首先,你实际上并没有get
在运行时对方法进行强制转换:这就是未经检查的强制转换意味着什么.
另一方面,泛型引入了大量的强制转换 - 基本上泛型只是一种避免手动插入强制转换的方法.因此,如果演员表存在问题(例如表演),你已经在很多地方都观察到了这一点.
用Kubrick的话说:不要担心,并且喜欢演员.