建议 3:三元操作符的类型务必一致

三元操作符是if---else的简化写法,在项目中使用她的地方很多,也非常好用,但是好用又简单的东西并不表示可以随便使用(老实人也不是可以随便欺负的),所以我们来看一下下面这代码:

public class Client {
    public static void main(String[] args) {
        int i = 80;
        String s = String.valueOf(i<100?90:100);
        String s1 = String.valueOf(i<100?90:100.0);
        System.out.println("两者是否相等:"+s.equals(s1));
    }
}

我们先分析一下这个程序:i是80,那他自然是小于100的,所以两者的返回值肯定都是90,再转成string类型,其值也绝对相等,这是毋庸置疑的。
话到这里果真是没有问题的吗?
先说一下我第一次看到这段程序时的第一反应吧!第一落眼处就放在了100和100.0并且后面还跟着一个equals很明显的整数型和浮点型(double、float)数据比较。
接下来我们一块看一下,在变量s中,三元操作符中的第一个操作数(90)和第二个操作数(100)都是int类型,类型相同,返回结果也就是int类型的90,而变量s1的情况就有所不同了,第一个操作数是90(int类型),第二个操作数却是100.0(浮点型),两个操作类型不一致,可三元操作符必须要返回一个数据,而且类型要确定,不可能条件为真时返回int类型,条件为假时返回float类型,编译器是不允许如此的,所以他就会进行类型转换了,int型转换为浮点型90.0,也就是说三元操作符的返回值是浮点数90.0,那么自然与整型的90是不等的。这里大家可能会有点疑惑,为什么是整型转浮点型而不是浮点型转整型呢?
三元操作符类型的转换规则:
1、若两个操作数不可转换,则不做转换,返回值为object类型;
2、若两个操作数是明确类型的表达式(比如变量),则按照正常的二进制数字转换,int转float,float转long等;
3、若两个操作数中有一个操作数S,另一个是表达式,且其类型标识为T,那么,若数字S在T的范围内,则转换为T类型;若S超出了T类型的范围,则T转换为S类型;
4、若两个操作符都是直接量数字(literal),则返回值类型为较大者。
所以,这里我们要注意的是在转换过程中注意数据类型是否一致。其次,隐隐约约感觉到还要注意一下强转。

猜你喜欢

转载自blog.csdn.net/A_BlackMoon/article/details/84872265