在这个例子中,需要拆箱时是否使用装箱?

In this example, is boxing used when unboxing is needed?

我在理解 Programming Language Pragmatics, by Scott

的以下部分时遇到一些困难

C# and more recent versions of Java perform automatic boxing and unboxing operations that avoid the wrapper syntax in many cases:

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

Here the Java compiler creates hidden Integer objects to hold the values 13 and 31, so they may be passed to put as references. The Integer cast on the return value is still needed, to make sure that the hash table entry for 13 is really an integer and not, say, a floating-point number or string. Generics, which we will consider in Section 7.3.1, allow the programmer to declare a table containing only integers. In Java, this would eliminate the need to cast the return value. In C#, it would eliminate the need for boxing.

  1. 我想知道“return 上的整数是什么意思 仍然需要值,以确保 13 的散列 table 条目 实际上是一个整数而不是浮点数或 string"?注意这是在Java.

    int m = (Integer) ht.get(13);中,是否使用装箱(通过 (Integer)) 在拆箱期间(分配给 int)?

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

  2. 泛型如何 "eliminate the need to cast the return value" Java ?

    在C#中,如何"eliminate the need for boxing"?

谢谢。

  1. 没有在 ht 的声明中指定泛型类型,get() 的 return 类型是 Object,所以你必须转换它至 Integer。 Java 然后会自动拆箱到 int

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

  2. 使用泛型类型时,ht 可能会声明为 Map<Integer, Integer>,因此 get() 会 return Integer,演员表是多余的。

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