当我尝试这样声明字典时:
private Dictionary<String, int> map;
编译器给我以下错误:
标记“int”上的语法错误,此标记后预期的尺寸
但它适用于Integer
. 我隐约知道 Java 对待int
/Integer
的方式不同(我来自 .NET 背景),但我希望有人能给我一个完整的解释,说明为什么我不能在 Dictionary<> 中使用原语
当我尝试这样声明字典时:
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);
但这实际上只是编译器自动为您转换类型。
在 .Net 中,“原始”类型由对象支持。在 Java 中,原始类型和对象之间有很大的区别。Java 5 引入了自动装箱,在某些情况下可以在两者之间进行强制。但是,因为 Java 泛型系统使用类型擦除,所以在这种情况下没有足够的信息来自动装箱。
Java 集合只允许引用而不是原语。您需要使用包装类(在本例中为 java.lang.Integer)来完成您的工作:
private Dictionary<String, Integer> map;
他们可以执行以下操作:
int foo = map.get("hello");
和
map.put("world", 42);
Java 使用自动装箱/拆箱来为您处理转换的细节。
这里是关于它的一点描述。
扩展 TofuBeer 的答案。
int 是原语
整数是一个对象。
泛型不支持原语。
@XmlJavaTypeAdapter(value=MyAdapter.class, type=int.class)
这就是指定类型以使其与原语一起使用的技巧
在您的适配器中
在 package-info 中使用相同的内容意味着您在全局范围内为该包执行此操作
实验后发现这个。
public class MyAdapter extends XmlAdapter<String, Integer> {
因为在 Java 中,原语是真正的原语。在 Javaint
中将通过值传递,而Integer
将传递引用。在 .NET 中,int 或 Int32 等只是不同的名称。