这个问题是关于"为什么autoboxing在Java中使一些调用变得模棱两可?"
但通过阅读答案,有许多参考铸造,我不确定我完全理解差异.
有人可以提供简单的解释吗?
拳击是指将原始类型转换为引用类型时,反拳击是相反的.转换是指您希望将一种类型视为另一种类型,在基本类型和引用类型之间,这意味着隐式或显式装箱操作.是否需要明确是语言功能.
转换和装箱/拆箱都与类型和明显(或实际)转换有关,但装箱/拆箱特定于基本类型与其对应的包装类型之间的关系,而转换是明确或隐式更改类型的术语.更普遍的意义.
铸造是一个通用术语,有两个相关但不同的含义:
处理一种类型的值,就好像它是另一种类型的值一样.第一个用法的两个例子是:
1.1.鉴于该类B
扩展了类A
,您可以通过编写可以显示对实例的引用的任何地方来请求myB
将实例B
视为实例.这实际上并不会产生新的实例.A
((A) myB)
A
A
1.2.Pre-Java5集合将所有内容存储为Object
; 这通常要求您在从集合中检索对象后使用强制转换.例如,如果你已经存储了String
a Map
并且需要获取它的长度,你就会编写类似于((String) myMap.get(someKey)).length()
调用length
方法所需的强制转换的地方String
.同样,这不会导致String
创建新的.
明确地将一种类型转换为另一种类型(即明确地改变表示).第二种用法的一个示例是在表达式中((int) (float_var + 0.5F))
,通过添加0.5(生成浮点值)然后将该值显式转换为整数来舍入浮点变量.生成的整数值(在(int)
强制转换之后)由内部计算从其他值生成.
当存在超类/子类或接口/实现者关系(上面的含义1)或两种类型是原始数字类型(意思是2)时,可以进行转换.您可能会查找"扩大"和"缩小"以获取更多详细信息.
Boxing是指在容器对象中包装原始类型,通常仅在必须具有对象时才进行(例如,在集合中存储值).原始类型和包装类型成对出现:
int Integer long Long boolean Boolean ... ...
取消装箱只是意味着从其对象包装器中检索原始值.
从Java5开始,当您编写一个使用原始值的表达式,其中需要相应的包装类型(例如将整数放入集合中)时,编译器会自动滑入实际包含该原始值的代码中.同样,它将为您提供解包代码.
因此,而不是写(在Java5之前)像:
Map myMap = new HashMap(); ... myMap.put(someKey,Integer.valueOf(3)); ... int nextValue = (myMap.get(someKey)).intValue() + 1;
你可以写:
MapmyMap = new HashMap (); ... myMap.put(someKey,3); ... int nextValue = myMap.get(someKey) + 1;
并且编译器插入装箱/拆箱代码.
Listlist = (List )object;
是一个演员.
void doSomething(Integer i) { ... } ... doSomeething(5);
是自动拳击.
Integer getSomething(); ... int i = getSomething();
是自动取消装箱.