我很难理解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#中,它将消除对拳击的需要。
我想知道它是什么意思"返回的整数投射 仍需要值,以确保13的哈希表条目 是一个整数,而不是一个浮点数或 字符串&#34 ;?请注意,这是Java。
在int m = (Integer) ht.get(13);
中,它是否使用拳击(by
取消装箱期间(Integer)
)(转让给int
)?
具体来说,(integer)
是否将其操作数转换为对象
Integer
班?但它的操作数ht.get(13)
已经是一个
Integer
对象,现在赋值期望内置值
输入int
。因此,我们不需要从Integer
转换为int
这里吗?
泛型"如何消除投出返回值的需要"在 Java?
在C#中,它将如何消除拳击的需要"?
感谢。
答案 0 :(得分:4)
如果未在ht
声明中指定通用类型,则get()
的返回类型为Object
,因此您必须将其转换为Integer
。然后,Java会自动将其解包为int
。
演员本身不进行任何转换。它只是告诉编译器将Object
视为Integer
。如果对象实际上不是Integer
,则会在运行时发生ClassCastException
。
使用泛型类型时,ht
可能会被声明为Map<Integer, Integer>
,因此get()
会返回Integer
,而施法会是多余的。
在C#中,它可以声明为Map<int, int>
的Java等价物。 Java不支持 primitive 类型作为泛型类型参数,因此语法是非法的。