2.12 赋值中的类型转换
在编程中,常常需要将一种类型的变量赋值给另一种类型的变量。例如,要把int值赋给float变量,如:
当在一个赋值语句中有兼容的类型时,运算符右边的值自动转换为左边的类型。于是,在上面的代码片段中,变量i的值转换为float类型,然后赋给变量f。但是,由于Java有严格的类型检查,不是所有的类型都互相兼容,因此,不是所有的隐式转换都允许发生。例如,boolean类型与int类型就不兼容。
当把一种类型的数据赋给另一种类型的变量时,在以下情况下会发生自动类型转换(automatic type conversion):
两种类型兼容。
目标类型比源类型范围更大。
当满足这两个条件时,发生类型扩张的转换。例如,对于所有有效的byte类型的值而言,int类型总是足够大的,可以保存。而且,int类型和byte类型都是整数类型。所以,发生从byte类型到int类型的自动转换。
对于扩大范围的转换,数值型数据(包括整数类型和浮点数类型)都互相兼容。例如,因为从long类型到double类型是扩大范围的转换,其能自动执行,所以下面的程序完全可以运行:
尽管从类型long到类型double有自动转换,但是从类型double到类型long没有自动转换,因为这并不是扩大范围的转换。于是,上面的程序若改成下面的版本,就无效:
没有从数值类型到char类型或boolean类型的自动转换。char类型与boolean类型也不互相兼容。但是,可以把一个整数字面量赋给char类型。