类型安全:方法put(Object,Object)属于原始类型HashMap . 应该参数化对泛型类型HashMap的引用 .
可能在你的代码中的某个地方
Map map = new HashMap();
您应该使用hashmap中的键和值的 types 对其进行参数化 . 例如,如果使用 String keys en SomeObject 对象,则应使用:
String
SomeObject
Map<String, SomeObject> map = new HashMap<String, SomeObject>();
使用泛型来定义您的集合,如下所示 .
List<String> list=new ArrayList<String> ();
对于您的情况,它是一张 Map ,您可以使用
Map<String,String> map=new HashMap<String,String>();
如果您将 immutable 对象定义为 keys ,如 String class 将是一个很好的做法
immutable
keys
String class
创建hashmap的正确方法是
HashMap<String, Integer> hashmap = new HashMap<String, Integer>();
您可以将String和Integer替换为您想要的任何类 . 第一个是所有键必须的类,第二个是所有值必须是的 .
理想情况下,你不应该使用它 . 使用泛型集合类型时,您需要更加具体地了解要作为键和值对象放置在 Map 中的对象类型 . 泛型有助于强制执行所谓的编译时类型检查 .
但是如果您仍然坚持使用它,那么在您获取此警告的方法上或在发出此警告的代码语句上方使用@SuppressWarnings(“unchecked”)注释 . 但是,当您将对象从 Map 中获取并在代码中使用后,会给您施加负担 . 由于在继承层次结构中出现错误类型的情况,代码中的问题只有在jvm抛出类种姓异常时才会在运行时可见 .
你有一个通用 HashMap<T1, T2> 并尝试为它添加一个非T1和T2类型的键值对 . 即你有:
HashMap<T1, T2>
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) 方法 .
HashMap
put(Object, Object)
put(T1, T2)
有关详细信息,请参阅What is wrong with Java's generics? .
5 回答
可能在你的代码中的某个地方
您应该使用hashmap中的键和值的 types 对其进行参数化 . 例如,如果使用
String
keys enSomeObject
对象,则应使用:使用泛型来定义您的集合,如下所示 .
List<String> list=new ArrayList<String> ();
对于您的情况,它是一张 Map ,您可以使用
Map<String,String> map=new HashMap<String,String>();
如果您将
immutable
对象定义为keys
,如String class
将是一个很好的做法创建hashmap的正确方法是
您可以将String和Integer替换为您想要的任何类 . 第一个是所有键必须的类,第二个是所有值必须是的 .
理想情况下,你不应该使用它 . 使用泛型集合类型时,您需要更加具体地了解要作为键和值对象放置在 Map 中的对象类型 . 泛型有助于强制执行所谓的编译时类型检查 .
但是如果您仍然坚持使用它,那么在您获取此警告的方法上或在发出此警告的代码语句上方使用@SuppressWarnings(“unchecked”)注释 . 但是,当您将对象从 Map 中获取并在代码中使用后,会给您施加负担 . 由于在继承层次结构中出现错误类型的情况,代码中的问题只有在jvm抛出类种姓异常时才会在运行时可见 .
你有一个通用
HashMap<T1, T2>
并尝试为它添加一个非T1和T2类型的键值对 . 即你有:你要:
这是因为Java中的泛型只是模拟的 . 类型
HashMap<T1, T2>
仅存在于编译时,并且实际上是一种更好的方式来声明您的旧的非泛型HashMap
. 因此,它仍然具有原始的put(Object, Object)
方法 . 在其他语言中,例如C#,该方法将不存在,而您将使用put(T1, T2)
方法 .有关详细信息,请参阅What is wrong with Java's generics? .