java - 调用 Map#put() 时关于原始类型的编译器警告

标签 java generics compiler-warnings

我构建了一个接收通用对象的 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 type Map<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);
    }
}

在这里你可以看到编译器提示的地方:

Code screenshot

最佳答案

改变

private Map map = new HashMap();

private Map<Type1, Type2> map = new HashMap<>();

其中 Type1Type2 是 map 的 keyvalue 的类名称(分别)

例如,声明由 Integer 索引的 String 值的映射: (请注意,您不能使用原始类型)

private Map<Integer, String> map = new HashMap<>();

您的方法的缺点可以从您的方法的第 3 行看出,其中需要进行向下转换。显然,如果键值对被不同的值类型替换,这可能会导致ClassCastException。 (在本例中,您向下转换为 int,这是无效的)

通过参数化映射,您将强制将对象类型包含在其中(或要使用的键类型)

关于java - 调用 Map#put() 时关于原始类型的编译器警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34370169/

相关文章:

java - 正则表达式模式来抓取部分的变化部分

java - 如何在 SOAPHandler 中使用 spring bean

generics - Scala - 协变类型层次结构的根

java - 在 Java 中创建包含数组的泛型类

java - 是否可以创建一个适用于 Java 中不同类的泛型方法?

java - 在java中解析JSON(Eclipse)

compiler-errors - 如何找出为什么xlC返回码非零?

Maven:在常规编译期间报告警告,但不适用于生成的源

java - 如何在没有原始类型的情况下使用泛型类型参数编写 Lambda

java - 将 Elasticsearch 与 Spring Boot 结合使用时出错