使用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等只是不同的名称。