快速业务通道

体验J2SE 1.5新特性之装箱和拆箱 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-24

使用Autoboxing和Auto-Unboxing,并不需要什么特别的步骤,一切都会在编译器的安排下自动发生。

现在可以这样来对待一个int型的数据:

清单3:自动完成的Boxing操作

Collection al = new ArrayList(); al.add(1);

因为编译器会悄悄的把这段代码转换成接近这个样子:

清单4:作了Autoboxing之后的等价形式

Collection al = new ArrayList(); al.add(Integer.valueOf(1));

这里所用的能接受int类型的值为参数,生成Integer实例的valueOf方法,是J2SE 1.5中新加入的内容。其它包裹类也都有可以接受对应的基本类型的值为参数,生成对应的包裹类实例的valueOf方法加入。

而这样对待一个Integer型的对象也是可以的:

清单5:自动完成的Unboxing操作

Integer one = new Integer(1); int two = one + 1;

因为编译器会悄悄的把这段代码转换成类似这个形状:

清单6:作了Auto-Unboxing之后的等价形式

Integer one = new Integer(1); int two = one.intValue() + 1;

大体上,只要把一个结果类型是基本类型的表达式,放到需要让它们的包裹类出现的位置上,就会诱发Autoboxing;类似的,只要把一个结果类型是包裹类的表达式,放到只允许相应的基本类型出现的位置上,就会诱发Auto-Unboxing。

“Autoboxing/Auto-Unboxing”特性的来源

J2SE 1.5中增加的许多语言特性都可以在C#里找到对应的东西。不过根据Bruce Eckel对Joshua Bloch的采访,尽管Java的研发小组确实很关注C#(Joshua Bloch本人的案头就放着一本关于C#的书),但是只有“Autoboxing/Auto-Unboxing”和“Metadata”确实是从C#中直接借鉴来的特性。

体验J2SE 1.5新特性之装箱和拆箱(3)

时间:2010-07-08

3. 发生Autoboxing的具体时机

发生Autoboxing的具体时机,主要有这么三种:

把基本类型的数据赋给引用类型的变量时。例如把一个int型的数据赋给一个Integer型变量。

清单7:赋给引用类型的变量基本类型的数据

Integer i = 31415;

把基本类型的数据传给引用类型的参数时。例如给一个定义成Object的参数传递一个boolean型的数据。

清单8:传给引用类型的参数基本类型的数据

HashMap map = new HashMap(); map.put(true, null);

把基本类型的数据往引用类型上强制转化时。例如在一个long型的数据前面加上(Long)。

清单9:从基本类型的数据到引用类型上强制转化

System.out.println((Long) 27828L);

4. Autoboxing的局限

Autoboxing的机制有一个局限——只能把基本类型的数据往它们自己的包裹类(以及包裹类的上级类)上转化。

类似这样的代码是不能工作的,尽管int型的数据完全可以用一个Long对象来表示:

清单10:不能同时进行自动向上转型和Autoboxing

int i = 27828; System.out.println((Long) i);/* 编译时出错 */

这是因为这段代码实际上相当于:

清单11:Autoboxing操作会在自动向上转型之前发生

int i = 27828; System.out.println((Long) Integer.valueOf(i));/* 编译时出错 */

而Integer并不是Long的子类,所以这个转化无法进行。如果一定要进行这种操作,需要手工追加一次转型:

清单12:需要先强制向上转型,再作Boxing

int i = 27828; System.out.println((Long)(long) i);

体验J2SE 1.5新特性之装箱和拆箱(4)

时间:2010-07-08

5. 发生Auto-Unboxing的具体时机

发生Auto-Unboxing的具体时机,则主要有这么七种:

把包裹类对象赋给基本类型的变量时。例如把一个Integer型的数据赋给一个int型变量。

清单13:赋给基本类型的变量包裹类对象

int i = new Integer(32);

把包裹类对象传给基本类型的参数时。---www.bianceng.cn。例如给一个定义成boolean的参数传递一个Boolean型的数据。

清单14:

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号