哈希表不能用int,char

可能重复:
将原始值存储在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; } 

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

generics参数只能绑定到引用types,而不是原始types,所以你需要使用相应的包装types。 尝试使用HashMap<Character, Integer>来代替。

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

这是由于types擦除 。 Java从一开始就没有generics,所以HashMap<Character, Integer>实际上是一个HashMap<Object, Object> 。 编译器会执行一些额外的检查和隐式转换,以确保不会将错误types的值放入或取出错误的types,但在运行时只有一个HashMap类,它存储对象。

在C ++中,其他语言“专用化”types, vector<bool>与内部vector<my_class>非常不同,它们不共享公共vector<?>超types。 Java定义了一些东西,所以List<T> 是一个 List而不pipeT是为了向后兼容预先generics的代码。 这种向后兼容性要求必须有一个用于genericstypes的所有参数化的单个实现类,这防止了允许generics参数绑定到基元的模板专门化types。

generics不能以关键字的forms使用原始types。

使用

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

generics只支持对象types,而不是原语。 与C ++模板不同,generics不涉及代码生成,只有一个HashMap代码,无论您使用的genericstypes的数量如何。

Trove4J通过预先生成所选集合来使用原语并支持TCharIntHashMap ,如果需要的话Map<Character, Integer>它可以打包以支持Map<Character, Integer>

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

散列图只能使用classes ,而不能使用primitives 。 programmerinterview.com的这个页面可以用来指导你find答案。 说实话,我自己并没有弄清楚这个问题的答案。

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

通用集合类不能用于基元。 改用Character和Integer包装类。

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

Generics只能使用Wrapper类来定义。 如果你不想使用Wrappertypes定义,你可以使用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; } 

或者使用包装器types定义HashMap,并存储基元types。 原始值将被提升为它们的包装types。

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