2.13 使用强制类型转换
尽管自动类型转换很有用,但是由于它们只能用于兼容类型间扩大范围的转换,它们也不能满足所有的编程需要。对于其他情况,只能运用强制类型转换。强制类型转换(cast)是告诉编译器将一种类型转换为另一种类型。所以,它需要显式类型转换。强制类型转换具有以下一般形式:
(target-type) expression
这里,target-type指定特定表达式转化到何种目标类型。例如,如果想把表达式x/y的类型转换为int类型,可以写成:
这里,尽管变量x和y都是double类型的,但是强制类型转换的结果是int类型。x/y两侧的圆括号是必需的。否则,向int类型的强制类型转换只针对变量x而不针对除法的结果。由于从double类型到int类型没有自动类型转换,因此强制类型转换是必需的。
当强制类型转换是缩小范围的转换(narrowing conversion),信息可能会丢失。例如,当从long类型转换为short类型时,如果long类型的值比short类型的范围大,高位就会截去,信息丢失。当把浮点值转换为整数值时,小数部分也会由于截断而丢失。例如,如果将值1.23赋给整数,结果就仅仅是1。小数部分0.23就丢失了。
下面的程序演示需要强制类型转换的类型转换:
程序输出如下所示:
在程序中,将(x/y)强制转换为int类型使小数部分发生截断,信息丢失。接下来,当把值100赋予变量时,由于byte类型可以存储值100,因此没有信息损失。但是,当试图把值257赋予变量b时,由于257超过了byte的最大值,因此信息丢失。最后,当将byte值赋给char类型时,没有信息丢失,但需要强制类型转换。