Hashmap不适用于int,char

时间:2012-11-04 05:29:37

标签: java hashmap

  

可能重复:
  Storing primitive values in a Java collection?

在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;
}

我收到与不当类型有关的错误。我分别使用Character和Integer而不是char和int解决了我的问题。但是,我无法弄清楚为什么HashMap无法处理原始数据类型。

7 个答案:

答案 0 :(得分:112)

通用参数只能绑定到引用类型,而不是基本类型,因此您需要使用相应的包装类型。请改为HashMap<Character, Integer>

  

但是,我无法弄清楚为什么HashMap无法处理原始数据类型。

这是由于type erasure。 Java从一开始就没有泛型,因此HashMap<Character, Integer>实际上是HashMap<Object, Object>。编译器会执行一系列额外的检查和隐式转换,以确保您没有输入错误类型的值或输出错误的类型,但在运行时只有一个HashMap类,它存储对象。

其他语言“specialize”类型在C ++中,vector<bool>与内部vector<my_class>非常不同,并且它们不共享公共vector<?>超类型。 Java虽然定义了一些内容,但List<T> is a List无论T是什么,都与向前通用代码向后兼容。这种向后兼容性要求必须为泛型类型的所有参数化提供单个实现类,这样可以防止允许泛型参数绑定到基元的模板特化类型。

答案 1 :(得分:11)

泛型不能以关键字的形式使用原始类型。

使用

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<>();

答案 2 :(得分:3)

泛型仅支持对象类型,而不支持基元。与C ++模板不同,泛型不涉及代码生成,并且只有一个HashMap代码,无论您使用的泛型类型的数量如何。

Trove4J通过预先生成选定的集合来使用原语并支持TCharIntHashMap来解决这个问题,如果需要,可以将其包装起来以支持Map<Character, Integer>

  

TCharIntHashMap:char键和int值的开放式地址实现。

答案 3 :(得分:2)

哈希地图只能使用classes,而不是primitives。来自programmerinterview.com的page可能有助于指导您找到答案。说实话,我自己还没有详细解决这个问题的答案。

答案 4 :(得分:2)

您不能将原始类型放入集合中。但是,您可以使用相应的对象包装器声明它们,并且仍然可以添加原始值,只要拳击允许您。

答案 5 :(得分:2)

通用集合类不能与基元一起使用。请改用Character和Integer包装类。

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

答案 6 :(得分:2)

Generics只能使用Wrapper类定义。如果您不想使用Wrapper类型定义,可以使用Raw定义,如下所示

@SuppressWarnings("rawtypes")
public HashMap buildMap(String letters)
{
    HashMap checkSum = new HashMap();

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

或者使用包装类型定义HashMap,并存储基元类型。 原始值将被提升为其包装类型。

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;
}
相关问题