Java中的映射泛型

Java中的映射泛型,java,generics,Java,Generics,我似乎对Java泛型有点误解,希望您能帮助我。我试图创建一张这样的地图: Map<Debater, int> Map (Debater是我声明的接口)但是java抱怨int,所以我做了: Map<Debater, Integer> Map 我想这是因为int不是一个类,而Integer是,对吗 另外,现在我有一个辩论者,我需要在地图上为它的值加1。我该怎么做?你说得对,因为你必须指定一个类 至于你的问题,你只需要做: myMap.put(myDebater, my

我似乎对Java泛型有点误解,希望您能帮助我。我试图创建一张这样的地图:

Map<Debater, int>
Map
(Debater是我声明的接口)但是java抱怨int,所以我做了:

Map<Debater, Integer>
Map
我想这是因为int不是一个类,而Integer是,对吗


另外,现在我有一个辩论者,我需要在地图上为它的值加1。我该怎么做?

你说得对,因为你必须指定一个类

至于你的问题,你只需要做:

myMap.put(myDebater, myMap.get(myDebater) + 1);
int和Integer之间的所有转换都将由完成。

是的,您是正确的

至于递增:

map.put(debater, map.get(debater) + 1);
将负责对象和基本体之间的“切换”

请注意,如果您在映射中没有此辩论者的值,则这(如注释中所述)将抛出一个
NullPointerException
。因此,如果您想进行二合一,可以按如下方式进行返工:

map.put(debater, map.containsKey(debater) ? map.get(debater) + 1 : 1);

不能将基元类型(如
int
float
char
等)用作泛型类型-Java中的集合是泛型的。这就是为什么必须使用
Integer
而不是
int

我想这是因为int不是一个 类,而整数为,是吗 对吗

另外,现在我有了一个辩论者,我需要在地图上给它的值加上1。我该怎么做

这应该可以做到:

map.put(debater, map.get(debater)+1);
没错。A只能容纳s

另外,现在我有了一个辩论者,我需要在地图上为它的值加上1。我该怎么做

我建议您抓取它,以便在多线程环境中更安全

Map<Debater, AtomicInteger> map = new HashMap<Debater, AtomicInteger>();
// ...

map.get(debater).incrementAndGet();
Map Map=newhashmap();
// ...
get(debater).incrementAndGet();

否则,您需要向更新添加更多的代码,以避免线程获得“错误”的值。

关于int和Integer部分,您是正确的

要安全地增加值,请使用:

Integer currentValue = map.get(debater);
if(currentvalue == null) {
    map.put(debater, 1);
} else {
    map.put(debater, currentValue  + 1);
}

或者,如果您想处理辩论器不单独包含在映射中的情况,可以先使用
map.contains(debator)

Java不允许在泛型中使用基元类型。幸运的是,每个基元类型都有一个“box”引用类型,例如
int
Integer
Boolean
Boolean
,等等。该语言知道这种关联,可以为您自动装箱和拆箱。这意味着您可以执行以下操作:

 Integer i = 5;
 i++;
对于自动装箱/拆箱,您必须注意一些注意事项。典型的例子如下:

 List<Integer> list = new ArrayList<Integer>();
 list.add(3);              // this is autoboxed, and calls list.add(E)
 list.remove(3);           // this invokes list.remove(int) overload !!!!
 list.remove((Integer) 3)  // this is how you call list.remove(E)
List List=new ArrayList();
列表。添加(3);//这是自动装箱和呼叫列表。添加(E)
列表。删除(3);//这将调用列表。删除(int)重载!!!!
list.remove((整数)3)//这就是调用list.remove(E)的方式

你会发现上面的代码会抛出
IndexOutOfBoundsException
,因为第一个
remove
试图删除第三个元素,而不是元素3。

当映射不包含辩论符时,这将抛出NullPointerException。int和Integer都不是类,它们都是类型。它们都有类表示:int.class和Integer.class。区别在于:int是一个基本类型。@Willi:java.lang.Integer肯定是一个类。