我构建了一个接收通用对象的 Java 类;
仅类字段设置为:
private Map map = new HashMap<T,Integer>();
我的问题是,在我编写的某些方法中,当我调用 put
时HashMap 对象的方法和编译器警告我并显示以下消息:
Type safety: The method
put(Object, Object)
belongs to the raw type HashMap. References to generic typeMap<K,V>
should be parameterized
我更喜欢避免编译器警告,因为它可能会导致运行时错误。
如果您能向我解释该消息以及我需要做什么来消除它,我将很高兴。
我写的方法是:
public void addItem(T item) {
if (this.map.containsKey(item)) {
this.map.put(item, (int)this.map.get(item) + 1);
}
else {
this.map.put(item, 1);
}
}
在这里你可以看到编译器提示的地方:
最佳答案
改变
private Map map = new HashMap();
至
private Map<Type1, Type2> map = new HashMap<>();
其中 Type1
和 Type2
是 map 的 key
和 value
的类名称(分别)
例如,声明由 Integer
索引的 String
值的映射:
(请注意,您不能使用原始类型)
private Map<Integer, String> map = new HashMap<>();
您的方法的缺点可以从您的方法的第 3 行看出,其中需要进行向下转换。显然,如果键值对被不同的值类型替换,这可能会导致ClassCastException。 (在本例中,您向下转换为 int
,这是无效的)
通过参数化映射,您将强制将对象类型包含在其中(或要使用的键类型)
关于java - 调用 Map#put() 时关于原始类型的编译器警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34370169/