不兼容类型的强制转换

尽管自动类型转换是很有帮助的,但他们不能满足所有的程序设计需要,因为他们只能应用于兼容类型之间的扩展转换.对于其他情况,必须使用强制转换.强制转换cast是一条让编译器将一种类型转换为另一种类型的指令.因此,需要艰辛显式的类型转换.强制转换的基本形式是:
(target-type) expression
这里是将特定表达式转换为target-type指定的类型.例如,如果要将表达式x/y的类型转换为int,可以编写如下代码:
double x,y;
(int) (x/y)
在此,即使x和y是double类型,强制转换也会将表达式的结果类型转换为int.表达式x/y必须加圆括号.否则,只会对x执行强制转换,而不会对除法结果进行强制转换.因为没有从double到int的自动转换,所以强制转换是必须的.
当强制转换涉及缩减转换(narrowing conversion)时,一些信息可能会丢失.例如,当把long强制转换为short时,如果long类型的值超出来short类型的范围,那么因为高序二进制位会被删除,所以会造成信息丢失,当一个浮点值被强制转换为整数时,小数部分也会由于被删除而丢失.例如,如果将1.23赋给一个整数,那么结果会是1,丢失了0.23
下面的程序演示了几个需要强制转换的类型转换:
    public static void main(String args[])
    {
        double x,y;
        byte b;
        int i;
        char ch;
        
        x = 10.0;
        y = 3.0;
        
        i = (int)(x/y);
        System.out.println("Integer outcome of x  / y : "+i);
        
        i = 100000;
        b = (byte)i;
        System.out.println("Value od b : "+b);
        
        b = 88;
        ch = (char)b;
        System.out.println("ch : "+ch);
        
    }
输出:
Integer outcome of x / y : 3
Value od b : -96
ch : X
该程序中,从x/y到int的强制转换导致小数部分被截去,从而丢失信息.接下来,因为byte类型可以存储值100,所以当把值100赋给b时不会发生信息丢失.然而,当试图将值257赋给b时,信息丢失就会发生,因为257超出了byte类型的最大值.最后一条赋值语句没有信息会丢失,但当把一个byte类型的值赋给一个char类型的变量时,需要强制转换.