在我的代码中,我需要保留一个对的集合,它们都是持有相同通用返回值的通用类型类(GenericTypeA<T>
和GenericTypeB<T>
,其中每对中的T总是相同的)像这样:
private HashMap<GenericTypeA<T>, GenericTypeB<T>> myMap;
当然,我无法像这样声明 map ,因为它对某些对使用不同的 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)
最佳答案
where the T will always be the same in each pair
Java 的类型系统的表达能力不足以让编译器知道这一点,因此您必须自己管理这个事实。
只要您在代码中正确执行此约束,此处未经检查的强制转换就不会出现任何问题。
Any way i can improve my code without suppressing warnings?
没有;抑制警告本身并不存在问题,只要您完全理解为什么会出现警告。
遵循Effective Java的建议,并评论抑制以记录为什么它是安全的,例如:
@SuppressWarnings("unchecked") // Safe because I make sure the Ts of key and value match.
GenericTypeB<T> value = (GenericTypeB<T>) myMap.get(key);
<小时/>
请注意,您不需要在代码中进行显式转换,因为您使用的是原始类型。不要:使用通配符绑定(bind)来代替:
private HashMap<GenericTypeA<?>, GenericTypeB<?>> myMap;
关于java - 返回多个泛型类时未经检查的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53517967/