在我的代码中,我需要保留一组对,这两个对都具有相同的泛型返回值(GenericTypeA<T>
和GenericTypeB<T>
,其中T总是相同每对)
private HashMap<GenericTypeA<T>, GenericTypeB<T>> myMap;
当然,由于某些对使用不同的T,因此我无法像这样声明地图,因此我使用了:
private HashMap<GenericTypeA, GenericTypeB> myMap;
给定GenericTypeA<T>
对象,我的代码应在GenericTypeB<T>
上使用T执行方法
public <T> void foo(GenericTypeA<T> key, T t){
GenericTypeB<T> value = myMap.get(key);
value.goo(t);
}
我在unchecked assignment
行收到GenericTypeB<T> toResolve = myMap.get(key);
警告,将值强制转换为GenericTypeB<T>
也不起作用。
值必须为GenericTypeB<T>
,因为它是goo()
方法接收(T t)
作为参数。
我能在不抑制警告的情况下改进代码吗?
(使用Java,Intellij ide)
答案 0 :(得分:1)
每对中的T总是相同的
Java的类型系统的表达能力不足以使编译器知道这一点,因此您必须自己管理这一事实。
只要您在代码中正确实施了此约束,此处未经检查的强制转换就没有问题。
我能在不抑制警告的情况下改进代码吗?
否;并且抑制警告本身就没有问题,前提是您完全理解为什么会出现警告。
遵循 Effective Java 的建议,并在文档为什么的安全性方面作如下注释:
@SuppressWarnings("unchecked") // Safe because I make sure the Ts of key and value match.
GenericTypeB<T> value = (GenericTypeB<T>) myMap.get(key);
请注意,由于您使用的是原始类型,因此不需要在代码中进行显式强制转换。不要:改用通配符绑定:
private HashMap<GenericTypeA<?>, GenericTypeB<?>> myMap;