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

当我试图宣布一个字典是这样的:

private Dictionary<String, int> map; 

编译器给我以下错误:

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

但它与Integer工作正常。 我隐约知道,Java对待int / Integer不同(我来自.NET的背景),但我希望有人可以给我一个完整的解释,为什么我不能在Dictionary <>中使用原语

在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); 

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

在.Net中,“原始”types由对象支持。 在Java中,原始types和对象之间有很大的区别。 Java 5引入了autoboxing,在某些情况下可以强制两者兼容。 但是,由于Javagenerics系统使用types擦除,所以在这种情况下没有足够的信息来自动复制。

Java集合只允许引用不是原语。 您需要使用包装类(在这种情况下,java.lang.Integer)来做你以后的事情:

 private Dictionary<String, Integer> map; 

他们可以做这样的事情:

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

 map.put("world", 42); 

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

这里是一个小的描述。

展开豆腐啤酒的答案。

int是一个原语

整数是一个对象。

generics不支持基元。

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

这就是技巧指定的types,使其与原语工作

在你的适配器

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

试验后发现这个。

 public class MyAdapter extends XmlAdapter<String, Integer> { 

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