在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无法处理原始数据类型。
答案 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;
}