当我尝试将字典声明为:
private Dictionary<String, int> map;
编译器给出了以下错误:
令牌“int”上的语法错误,此令牌后的预期维度
但它适用于Integer
。我模糊地意识到Java以不同的方式对待int
/ Integer
(我来自.NET背景),但我希望有人可以给我一个完整的解释,为什么我不能使用原语字典&lt;&gt;
答案 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等中只有不同的名称。