返回多个泛型类时未经检查的转换

时间:2018-11-28 11:04:28

标签: java generics casting variable-assignment

在我的代码中,我需要保留一组对,这两个对都具有相同的泛型返回值(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)

1 个答案:

答案 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;