返回多个通用时未经检查的转换 类
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;
在我的代码中,我需要保留一组对,它们都是泛型类型 类,它们具有相同的泛型 return 值(GenericTypeA<T>
和 GenericTypeB<T>
其中 T 在每一对中总是相同的)像这样:
private HashMap<GenericTypeA<T>, GenericTypeB<T>> myMap;
当然我无法像那样声明地图,因为它对某些对使用不同的 Ts,所以我使用了:
private HashMap<GenericTypeA, GenericTypeB> myMap;
给定 GenericTypeA<T>
的对象,我的代码应该在 GenericTypeB<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;