哈希表不能用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; }