返回多个通用时未经检查的转换 类

Unchecked casting while returning multiple generic classes

在我的代码中,我需要保留一组对,它们都是泛型类型 类,它们具有相同的泛型 return 值(GenericTypeA<T>GenericTypeB<T> 其中 T 在每一对中总是相同的)像这样:

private HashMap<GenericTypeA<T>, GenericTypeB<T>> myMap;

当然我无法像那样声明地图,因为它对某些对使用不同的 Ts,所以我使用了:

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);
}

我在 GenericTypeB<T> toResolve = myMap.get(key); 行收到 unchecked assignment 警告,将值转换为 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);

请注意,您不需要在代码中进行显式转换,因为您使用的是原始类型。不要:改用通配符绑定:

private HashMap<GenericTypeA<?>, GenericTypeB<?>> myMap;