哈希映射不适用于 int, char

2022-08-31 12:44:27

可能的重复:
在 Java 集合中存储基元值?

在java中,当我使用以下内容时:-

public HashMap<char, int> buildMap(String letters)
{
    HashMap<char, int> checkSum = new HashMap<char, int>();

    for ( int i = 0; i < letters.length(); ++i )
    {
        checkSum.put(letters.charAt(i), primes[i]);
    }

    return checkSum;
}

我收到与不适当的类型相关的错误。我通过使用字符和整数而不是字符和int分别解决了我的问题。但是,我很难弄清楚为什么HashMap无法处理基元数据类型。


答案 1

泛型参数只能绑定到引用类型,而不能绑定到基元类型,因此您需要使用相应的包装器类型。请尝试。HashMap<Character, Integer>

但是,我很难弄清楚为什么HashMap无法处理基元数据类型。

这是由于类型擦除。Java从一开始就没有泛型,所以a真的是一个.编译器会执行一系列额外的检查和隐式强制转换,以确保您不会输入错误类型的值或获取错误的类型,但在运行时,只有一个类并且它存储对象。HashMap<Character, Integer>HashMap<Object, Object>HashMap

其他语言“专门化”类型,因此在C++中,a与内部非常不同,并且它们不共享共同的超类型。Java定义了一些东西,所以a是一个,不管是什么,以便与前泛型代码向后兼容。这种向后兼容性要求,即泛型类型的所有参数化都必须有一个实现类,这阻止了允许泛型参数绑定到基元的模板特化类型。vector<bool>vector<my_class>vector<?>List<T>ListT


答案 2

泛型不能以关键字的形式使用基元类型。

public HashMap<Character, Integer> buildMap(String letters)
{
    HashMap<Character, Integer> checkSum = new HashMap<Character, Integer>();

    for ( int i = 0; i < letters.length(); ++i )
    {
        checkSum.put(letters.charAt(i), primes[i]);
    }

    return checkSum;
}

更新:在 Java 7 及更高版本中,您可以使用菱形运算符。

HashMap<Character, Integer> checkSum = new HashMap<>();