【发布时间】:2013-11-30 13:31:39
【问题描述】:
类型安全:方法 put(Object, Object) 属于原始类型 HashMap。对泛型 HashMap 的引用应该被参数化。
【问题讨论】:
类型安全:方法 put(Object, Object) 属于原始类型 HashMap。对泛型 HashMap 的引用应该被参数化。
【问题讨论】:
可能在你的代码中的某个地方
Map map = new HashMap();
您应该在哈希图中使用 keys 和 values 的 types 参数化它。例如,如果你使用 String 键和 SomeObject 对象,你应该使用:
Map<String, SomeObject> map = new HashMap<String, SomeObject>();
【讨论】:
使用泛型定义您的集合,如下所示。
List<String> list=new ArrayList<String> ();
对于您的情况,它是一张地图,因此您可以使用
Map<String,String> map=new HashMap<String,String>();
如果您将immutable 对象定义为keys 就像String class 一样,这将是一个好习惯
【讨论】:
创建hashmap的正确方法是
HashMap<String, Integer> hashmap = new HashMap<String, Integer>();
你可以用你想要的任何类来替换 String 和 Integer。第一个是所有键必须是的类,第二个是所有值必须是的类。
【讨论】:
理想情况下,您不应该使用它。使用泛型集合类型时,您希望更具体地了解将作为键和值对象放入映射中的对象类型。泛型有助于强制执行所谓的编译时类型检查。
但是,如果您仍然坚持使用它,那么请在您收到此警告的方法上或发出此警告的代码语句上方使用 @SuppressWarnings("unchecked") 注释。但是,在您从映射中获取对象并在您的代码中使用之后,您就有责任强制转换对象的类型。由于跨继承层次结构的错误类型案例导致的代码问题只有在 jvm 抛出类种姓异常时才会在运行时可见。
【讨论】:
你有一个通用的HashMap<T1, T2> 并尝试向它添加一个不是 T1 和 T2 类型的键值对。 IE。你有:
HashMap<T1, T2> map = ...;
Object o1
Object o2;
// ...
map.put(o1, o2); // generates warning
你想要:
HashMap<T1, T2> map = ...;
T1 o1;
T2 o2;
// ...
map.put(o1, o2); // no warning - notice the types!
这是因为 Java 中的泛型只是模拟的。 HashMap<T1, T2> 类型只存在于编译时,它确实是一种更好的方式来声明你的好旧的非泛型 HashMap。因此,它仍然具有原始的put(Object, Object) 方法。在其他语言中,例如 C#,该方法将不存在,而您将使用 put(T1, T2) 方法。
有关详细信息,请参阅What is wrong with Java's generics?。
【讨论】: