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

http://tech.ddvip.com   2006年11月27日    社区交流

本文详细介绍体验J2SE 1.5新特性之装箱和拆箱

  清单22:可以同时进行Auto-Unboxing和强制向上转型

Integer i = new Integer(32);
System.out.println((double) i);

  7. 其它不能自动转化的情况

  除去强制类型转化时的限制之外,还有这样一些情况下不会发生Autoboxing/Auto-Unboxing:

  1. 基本类型的数组和包裹类数组之间不会自动转化。这样的代码完全不被编译器接受:

  清单23:元素可以,容器不行

int[] ints = {1, 2, 3};
Integer[] integers = ints;/* 编译时出错 */

  2. 不能对着基本类型的表达式来调用包裹类里的方法。这样的申请会被编译器彻底拒绝:

  清单24:没有方法,就是没有方法

int i = 1;
byte b = i.byteValue();/* 编译时出错 */

  8. null的转化问题

  Java里的引用类型可以有一个特别的取值——“null”。试图对null进行Auto-Unboxing操作会导致一个“NullPointerException”。

  例如这段代码就会在运行时抛出异常,尽管在编译期间会表现得非常正常:

  清单25:表面上,只是普通的赋值

Integer i = null;
int j = i;/* 运行时错误 */

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

  清单26:实际上,是在试图调用null的方法

Integer i = null;
int j = i.intValue();/* 运行时错误 */

  而试图调用null的方法是一种不被虚拟机认可的行为。

  如果没记住有关的规则

  大部分违反了使用“Autoboxing/Auto-Unboxing”机制时,需要遵守的约束的代码,都会造成编译错误。因此,即使并未准确的记住有关的规则,也不难及时发现、改正。只有违背了“不能对null进行Auto-Unboxing操作”的限制时,引发的是运行时异常,需要特别小心。

责编:豆豆技术应用

正在加载评论...