34

当我尝试这样声明字典时:

private Dictionary<String, int> map;

编译器给我以下错误:

标记“int”上的语法错误,此标记后预期的尺寸

但它适用于Integer. 我隐约知道 Java 对待int/Integer的方式不同(我来自 .NET 背景),但我希望有人能给我一个完整的解释,说明为什么我不能在 Dictionary<> 中使用原语

4

6 回答 6

40

在 Java 中,原语不是对象,因此您不能使用它们来代替对象。然而,Java 会自动将原语(也称为自动装箱)装箱/拆箱到对象中,因此您可以执行以下操作:

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

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

于 2010-01-04T19:56:02.807 回答
9

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

于 2010-01-04T19:57:27.657 回答
5

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

private Dictionary<String, Integer> map;

他们可以执行以下操作:

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

map.put("world", 42);

Java 使用自动装箱/拆箱来为您处理转换的细节。

这里是关于它的一点描述。

于 2010-01-04T19:53:24.843 回答
1

扩展 TofuBeer 的答案。

int 是原语

整数是一个对象。

泛型不支持原语。

于 2010-01-04T20:02:03.110 回答
1
@XmlJavaTypeAdapter(value=MyAdapter.class, type=int.class)

这就是指定类型以使其与原语一起使用的技巧

在您的适配器中

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

实验后发现这个。

public class MyAdapter extends XmlAdapter<String, Integer> {
于 2011-05-31T00:00:59.810 回答
0

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

于 2010-01-04T19:56:16.753 回答