2.7 基本类型转换
在处理不同的数据类型的时候,我们常常需要进行转换。例如,将一个变量的值赋给另一个变量,就涉及转换。如果两个变量具有相同的类型,赋值总是会成功。从一种类型到相同类型的转换,叫作等同转换(identity conversion)。例如,如下的转换保证能够成功:
int a = 90;
int b = a;
然而,向不同的类型转换则无法保证成功,甚至不一定能够那么做。基本类型转换还有另外两种形式,即加宽转换(widening conversion)和收窄转换(narrowing conversion)。
2.7.1 加宽转换
当从一种基本类型向另一种基本类型转换的时候,如果后者的大小和前者相同或者更大,就会发生加宽转换;例如,从int(32位)到long(64位)的转换。在如下情况中,进行加宽转换:
从byte向short、int、long、float或double转换。
从short向int、long、float或double转换。
从char向int、long、float或double转换。
从int向long、float或double转换。
从float向double转换。
从一种整数类型向另一种整数类型的加宽转换,不会有信息丢失的风险。同样的,从float向double的转换也会保留所有的信息。然而,从int或long向float的转换,可能会导致精度丢失。
加宽的基本类型转换是隐式地发生的,不需要在代码中做任何事情。例如:
int a = 10;
long b = a; // widening conversion
2.7.2 收窄转换
收窄转换发生在从一种类型到另一种拥有较小的大小的类型的转换中,例如,从long(64位)到int(32位)的转换。通常,收窄转换在如下的情况中发生:
从short向byte或char。
从char向byte或short。
从long向byte、short或char。
从float向byte、short、char、int或long。
从double向byte、short、char、int、long或float。
和加宽基本类型转换不同,收窄基本类型转换必须是显式的。需要在圆括号中指定目标类型。例如,如下是从long向int的收窄转换。
long a = 10;
int b = (int) a; // narrowing conversion
第2行中的(int)告诉编译器,应该发生收窄转换。如果被转换的值比目标类型的容量还要大的话,收窄转换可能导致信息丢失。前面的例子并不会导致信息丢失,因为10对一个int类型来说足够小。然而,在如下的转换中,由于9876543210L对一个int类型来说太大了,会导致一些信息丢失。
long a = 9876543210L;
int b = (int) a; // the value of b is now 1286608618
有可能导致信息丢失的收窄转换,在你的程序中将会引入一个缺陷。