在此示例中,是否需要在取消装箱时使用装箱?

时间:2017-08-25 21:43:48

标签: java c# boxing unboxing

我很难理解Programming Language Pragmatics, by Scott

中的以下部分
  

C#和更新版本的Java执行自动装箱和   避免拆箱的拆箱操作   在许多情况下包装语法:

ht.put(13, 31);
int m = (Integer) ht.get(13);
     

这里Java编译器创建隐藏的Integer对象来保存   值13和31,因此它们可以作为参考传递。的的   仍然需要对返回值进行整数强制转换,以确保这一点   13的哈希表条目实际上是一个整数,而不是a   浮点数或字符串。泛型,我们将考虑   7.3.1节允许程序员声明一个只包含的表   整数。在Java中,这将消除转换回报的需要   值。在C#中,它将消除对拳击的需要。

  1. 我想知道它是什么意思"返回的整数投射 仍需要值,以确保13的哈希表条目 是一个整数,而不是一个浮点数或 字符串&#34 ;?请注意,这是Java。

    int m = (Integer) ht.get(13);中,它是否使用拳击(by 取消装箱期间(Integer))(转让给int)?

    具体来说,(integer)是否将其操作数转换为对象 Integer班?但它的操作数ht.get(13)已经是一个 Integer对象,现在赋值期望内置值 输入int。因此,我们不需要从Integer转换为int 这里吗?

  2. 泛型"如何消除投出返回值的需要"在 Java?

    在C#中,它将如何消除拳击的需要"?

  3. 感谢。

1 个答案:

答案 0 :(得分:4)

  1. 如果未在ht声明中指定通用类型,则get()的返回类型为Object,因此您必须将其转换为Integer。然后,Java会自动将其解包为int

    演员本身不进行任何转换。它只是告诉编译器将Object视为Integer。如果对象实际上不是Integer,则会在运行时发生ClassCastException

  2. 使用泛型类型时,ht可能会被声明为Map<Integer, Integer>,因此get()会返回Integer,而施法会是多余的。

    在C#中,它可以声明为Map<int, int>的Java等价物。 Java不支持 primitive 类型作为泛型类型参数,因此语法是非法的。