使用generics类型执行转换时出现警告

当我尝试执行此操作时,我不明白为什么会收到警告(未经检查的强制转换):

... Map map; ... Map castedMap = (Map) map; ... 

我的意思是将castedMap发布到外部代码有什么危险? 两种操作都可以在运行时完美地运行:

  • 使用SomeType类型的键从castedMap获取元素
  • 使用SomeType类型的键将元素放入castedMap。

我只是使用@SuppressWarnings(“unchecked”)来抑制警告。

答案可能很无聊:当有警告时,它不是类型安全的。 而已。

在此示例中可以看到为什么它不是类型安全的:

 import java.util.HashMap; import java.util.Map; class SomeType {} class SomeSubType extends SomeType {} class SomeOtherType {} public class CastWarning { public static void main(String[] args) { Map originalMap = new HashMap(); Map map = originalMap; Map castedMap = (Map) map; // Valid because of the cast: The information that the // key of the map is not "SomeType" but "SomeSubType" // has been cast away... SomeType someType = new SomeType(); SomeOtherType someOtherType = new SomeOtherType(); castedMap.put(someType, someOtherType); // Valid for itself, but causes a ClassCastException // due to the unchecked cast of the map SomeSubType someSubType = originalMap.keySet().iterator().next(); } }