2017-08-25 72 views
0

我有一定的难度,从Programming Language Pragmatics, by Scott在这个例子中,是否需要拆箱时使用装箱?

C#和最近的Java版本的理解下面的部分进行自动装箱和 拆箱操作是避免 包装语法在很多情况下:

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

这里Java编译器创建隐藏的Integer对象来保存值为13和31的 ,以便它们可以作为引用传递。 仍然需要在返回值上进行整型转换,以确保 13的哈希表条目确实是一个整数,而不是浮点数字或字符串,例如 。泛型,我们将在 第7.3.1节中考虑,允许程序员声明仅包含 整数的表。在Java中,这将消除需要投入返回值 的值。在C#中,它将消除对装箱的需求。

  1. 我想知道这是什么意思的“整型投在返回 值仍然需要,以确保13 哈希表项实际上是一个整数,而不是,比方说,一个浮点数或 字符串“?请注意,这是用Java编写的。

    int m = (Integer) ht.get(13);,在拆箱过程中是否使用拳击(由 (Integer))(转让给int)?

    具体来说,(integer)是否将其操作数转换为 Integer类的对象?但是其操作数ht.get(13)已经是对象,现在分配需要内置 类型的值int。所以我们不需要从Integerint 这里的转换吗?

  2. Java在 Java中泛型如何“消除需要返回值的值”?

    在C#中,它将如何“消除对拳击的需求”?

谢谢。

+1

在该示例中,'Hashtable#get'具有返回类型'Object'。这一评论与拳击无关。 –

+0

谢谢。为什么'(Integer)'应用于其返回,如果它的返回已经是'Integer'? – Tim

+1

在泛型世界中,(Integer)类型相当混乱,但这里的想法是将原始返回类型(Object)转换为(Integer),然后将其拆箱为(int)。 – eckes

回答

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不支持原始类型作为泛型类型参数,因此语法将是非法的。