使用int作为java.util.Dictionary的类型参数

时间:2010-01-04 19:51:56

标签: java dictionary primitive

当我尝试将字典声明为:

private Dictionary<String, int> map;

编译器给出了以下错误:

  

令牌“int”上的语法错误,此令牌后的预期维度

但它适用于Integer。我模糊地意识到Java以不同的方式对待int / Integer(我来自.NET背景),但我希望有人可以给我一个完整的解释,为什么我不能使用原语字典&lt;&gt;

6 个答案:

答案 0 :(得分:40)

在Java中,原语不是对象,因此不能使用它们来代替对象。但是,Java会自动将原始文件(也称为autoboxing)打包/取消打包成对象,以便您可以执行以下操作:

List<Integer> intList = new LinkedList<Integer>();
intList.add(1);
intList.add(new Integer(2));
...
Integer first = intList.get(0);
int second = intList.get(1);

但这只是编译器自动为您转换类型。

答案 1 :(得分:9)

在.Net中,“原始”类型由对象支持。在Java中,原始类型和对象之间存在着难以区分的区别。 Java 5引入了自动装箱,在某些情况下可以在两者之间强制执行。但是,因为Java泛型系统使用类型擦除,所以在这种情况下没有足够的信息来自动装箱。

答案 2 :(得分:5)

Java集合只允许引用而不是基元。您需要使用包装类(在本例中为java.lang.Integer)来完成您的操作:

private Dictionary<String, Integer> map;
你可以做以下事情:

int foo = map.get("hello");

map.put("world", 42);

和Java使用自动装箱/取消装箱来处理转换的细节。

Here对它有一点描述。

答案 3 :(得分:1)

扩展TofuBeer的答案。

int是原始

整数是一个对象。

泛型不支持基元。

答案 4 :(得分:1)

@XmlJavaTypeAdapter(value=MyAdapter.class, type=int.class)

多数技巧指定类型以使其适用于基元

在适配器中

在package-info中使用相同的内容意味着您可以在全局范围内为该包执行此操作

经过实验后发现了这一点。

public class MyAdapter extends XmlAdapter<String, Integer> {

答案 5 :(得分:0)

因为在Java中,原语是真正的原语。在Java中,int将按值传递,而Integer将传递引用。在.NET int或Int32等中只有不同的名称。