在程序设计中,经常要将一种类型的变量赋值给另一种类型的变量.例如,可能要将一个int类型赋值给一个float类型的变量:
int i; float f; i = 10; f = i;
当一条赋值语句中混合有兼容类型时,等号右侧值的类型会自动转换为左侧值的类型.因此,在上面的代码段中,i的值转换为一个float类型的值,然后赋值给变量f.然而因为Java有严格的类型检查,所以不是所有的类型都是相互兼容的,这也就是说并非所有的隐式类型转换都是允许的.例如,boolean就和int不兼容.
当把一种类型的数据赋给另一种类型的变量时,会发生自动类型转换的条件是:
两种类型兼容.
目标类型比源类型大.
当两个条件都满足时,发生扩展转换(didening consersion).例如,int类型足以包含所有有效的byte值,而int和byte又都是整数类型,所以可以进行从byte到int的自动类型转换.
对于扩展转换,数值类型相互都是兼容的.例如,因为从long到double是自动执行的扩展转换,所以下面的程序是完全有效的:
public static void main(String args[]) { long L; double D; L = 12345678L; D = L; System.out.println("L : "+L+" D : "+D); }
输出:
L : 12345678 D : 1.2345678E7
尽管有从long到double的自动转换,但从double到long没有自动转换,因为这不是一个扩展转换.因此,下面的程序是无效的.
public static void main(String args[]) { long L; double D; D = 1.234567; L = D; System.out.println("L : "+L+" D : "+D); }
输出:
Exception in thread "main" java.lang.Error: Unresolved compilation problem: Type mismatch: cannot convert from double to long at javaTest.test.main(test.java:12)
从数值类型到char或boolean没有自动类型转换,而且char和boolean之间也是不兼容的,但是整数字面值可以赋给一个char类型变量.