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

标签 java generics casting variable-assignment

在我的代码中,我需要保留一个对的集合,它们都是持有相同通用返回值的通用类型类(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/

相关文章:

c# - 使用类型 T 的成员创建类的实例,但不指定 T 类型

c - C 语言中的补码和信息丢失

c++ - 在 C 和 C++ 中使用浮点转换与浮点后缀之间有什么区别吗?

java - 为什么我不能在需要 List<X> 的地方使用实现 List<X> 的类?

java - 在现有的 java 类上使用 kotlin 实现 Parcelable

java - Android 重力问题

java - 如何在 Android 中使用计时器?

Scala:枚举值的通用解析器

java - Android Java 类转换

java - 为什么我用Java计算的结果是错误的?