【问题标题】:Using int as a type parameter for java.util.Dictionary使用 int 作为 java.util.Dictionary 的类型参数
【发布时间】:2011-01-01 09:15:58
【问题描述】:

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

private Dictionary<String, int> map;

编译器给我以下错误:

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

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

【问题讨论】:

  • 来自 Dictionary 的 javadoc:注意: 此类已过时。新的实现应该实现 Map 接口,而不是扩展这个类。
  • 把它作为答案,我会+1(再次)
  • 嗯,我不在乎 - 你这样做,我会给你 +1 :)

标签: java dictionary primitive


【解决方案1】:
@XmlJavaTypeAdapter(value=MyAdapter.class, type=int.class)

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

在您的适配器中

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

实验后发现。

public class MyAdapter extends XmlAdapter<String, Integer> {

【讨论】:

    【解决方案2】:

    扩展 TofuBeer 的答案。

    int 是原语

    整数是一个对象。

    泛型不支持原语。

    【讨论】:

    • 我想说这更像是一个总结而不是扩展:)
    【解决方案3】:

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

    private Dictionary<String, Integer> map;
    

    你可以这样做:

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

    map.put("world", 42);
    

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

    Here是关于它的一点描述。

    【讨论】:

    • 我在我的原始帖子中提到它可以在Integer 工作。我希望能解释原因
    • int[] 不是原语吗?它可能只是期待一个数组,对吧?
    • 从技术上讲,Dictionary 不是 Java 集合框架的一部分,所以这并不能真正解释为什么 intDictionary 对象中是不允许的。
    • 数组是引用而不是原语:“数组类型的变量包含对对象的引用。” java.sun.com/docs/books/jls/third_edition/html/arrays.html#10.2
    • 字典在 Java 中已经存在了很长时间,在添加接口之前(这就是为什么它不是接口但它应该是)。集合框架是在 JDK 1.2 中添加的,以解决缺少通用集合的问题。所以它不是框架的一部分,但它是一个远亲 :-) 在 Java 中没有办法让一个变量同时保存一个原始和一个引用,所以没有办法制作一个适用于原始和引用的字典同时参考。您必须创建一个适用于 int 的 IntDictionary...
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 除了泛型是编译过程的一部分——在发帖人的例子中没有任何东西“通过”。
      • 仅供参考,int/Int32 在 .NET 中也将通过引用传递,因为它们是值类型(因此存在于堆栈中)。
      • 另外,int 只是 c# 中Int32 的别名。 VB.NET 使用Integer
      • (更正我自己的评论)int/Int32 将通过 value
      【解决方案6】:

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

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

      【讨论】:

      • 嗯,Java 在这里的效率是否低于 .NET,因为它会强制您在将整数添加到集合之前对其进行装箱?这是 .NET 中 Dictionary&lt;TKey,TValue&gt; 相对于 HashTable 的常见优势之一——您可以避免装箱。
      • “此标记之后的预期尺寸”是什么意思?它是指一个数组,比如int[],因为它是一个Array 对象,所以没关系?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-29
      • 2017-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-28
      相关资源
      最近更新 更多