当前位置:  开发笔记 > 编程语言 > 正文

Java:自动装箱和铸造有什么区别?

如何解决《Java:自动装箱和铸造有什么区别?》经验,为你挑选了3个好方法。

这个问题是关于"为什么autoboxing在Java中使一些调用变得模棱两可?"

但通过阅读答案,有许多参考铸造,我不确定我完全理解差异.

有人可以提供简单的解释吗?



1> cmsjr..:

拳击是指将原始类型转换为引用类型时,反拳击是相反的.转换是指您希望将一种类型视为另一种类型,在基本类型和引用类型之间,这意味着隐式或显式装箱操作.是否需要明确是语言功能.


我相信这是正确的答案,但我不认为装箱/拆箱应该被描述为"转换".可能更清楚的是声明原语被包装在等效的Object中.

2> joel.neely..:

转换和装箱/拆箱都与类型和明显(或实际)转换有关,但装箱/拆箱特定于基本类型与其对应的包装类型之间的关系,而转换是明确或隐式更改类型的术语.更普遍的意义.

铸造是一个通用术语,有两个相关但不同的含义:

    处理一种类型的值,就好像它是另一种类型的值一样.第一个用法的两个例子是:

    1.1.鉴于该类B扩展了类A,您可以通过编写可以显示对实例的引用的任何地方来请求myB将实例B视为实例.这实际上并不会产生新的实例.A((A) myB)AA

    1.2.Pre-Java5集合将所有内容存储为Object; 这通常要求您在从集合中检索对象后使用强制转换.例如,如果你已经存储了Stringa 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;

你可以写:

Map myMap = new HashMap();
...
myMap.put(someKey,3);
...
int nextValue = myMap.get(someKey) + 1;

并且编译器插入装箱/拆箱代码.



3> cletus..:
List list = (List)object;

是一个演员.

void doSomething(Integer i) { ... }
...
doSomeething(5);

是自动拳击.

Integer getSomething();
...
int i = getSomething();

是自动取消装箱.


你的第二个例子是自动装箱,如果你拼写'doSomething'正确.....
推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有