【JAVA】【基础语法】Java中条件表达式的参数类型转换

参考:https://blog.51cto.com/12139097/2567558

一、?:表达式中,:前后的两个参数类型如何呢?

(1) 如果第1个和第2个操作数具有相同的类型,那么它就是条件表达式的类型。
(2) 如果一个操作数的类型是T,T表示 byte、short 或 char,而另一个操作数是一个int类型的常量表达式,它的值是可以用类型T表示的,那么条件表达式的类型就是T。
(3) 否则,将对操作数类型运用二进制数字提升,提升至两个参数中类型最高的类型,而条件表达式的类型即提升之后的类型。

对于这个结论,小编做了以下实验(以char类型为例):

//定义变量
static Character c1 = 'w';
static Integer i1 = 1;
 public static void main(String[] args) {
        Object k;
        System.out.println(k = true ? 'x' : 1.11);        //第1个操作数为char类型,第2个操作数为double类型,符合结论3,表达式类型向上转为Double类型。
        System.out.println(k = true ? c1 : 1);            //第1个操作数为char类型,第2个操作数为int类型,但i1却是变量不是常量表达式,符合结论3,表达式类型向上转为Integer类型。
        System.out.println(k = true ? c1 : i1);           //第1个操作数为char类型,第2个操作数为int类型,且这个表达式的结果恰好可以由char类型表示,符合结论2,表达式类型向上转为Character类型。
        System.out.println(k = true ? c1 : i1+1);        //第二个操作数为char类型,第三个操作数为int类型,但i1却是变量不是常量表达式,符合结论3,表达式类型为Integer类型。
        System.out.println(k = true ? c1 : 1+1);        //第二个操作数为char类型,第三个操作数中含有变量,不是常量表达式,符合结论3,表达式类型为Integer类型。
        System.out.println(k = true ? c1 : 'x'+'x');        //第二个操作数为char类型,第三个操作数为int类型常量表达式,且这个表达式的结果恰好可以由char类型表示,符合结论2,表达式类型为Character类型。
        System.out.println(k = true ? c1 : c1 + c1);        //第二个操作数为char类型,第三个操作数为char字符相加的和,字符相加,转换成Ascii码计算,所以是int类型常量表达式,且这个表达式的结果恰好可以由char类型表示,符合结论2,表达式类型为Character类型。
        System.out.println(k = true ? c1 : c1 + 'x');        //第二个操作数为char类型,第三个操作数中含有变量,不是常量表达式,符合结论3,表达式类型为Integer类型。
        System.out.println(k = true ? 'x' : 65535);        //第二个操作数为char类型,第三个操作数中含有变量,不是常量表达式,符合结论3,表达式类型为Integer类型。
        System.out.println(k = true ? c1 : 65536);        //第二个操作数为char类型,第三个操作数为int类型表达式,且这个表达式的结果恰好可以由char类型表示,符合结论2,表达式类型为Character类型。                                   
        System.out.println(k = true ? c1 : -1);            //第二个操作数为char类型,第三个操作数为int类型表达式,但这个表达式的结果不能用char类型表示,符合结论3,表达式类型为Integer类型。第二个操作数为char类型,第三个操作数为int类型表达式,但这个表达式的结果不能用char类型表示,符合结论3,表达式类型为Integer类型。 
 }

注:char表示的范围是:0~65535

So,建议?:表达式中,:前后的两个参数类型相同,或通过显式的类型转换,保持两者类型相同,避免非预期的结果。

原文地址:https://www.cnblogs.com/yickel/p/14594956.html