您的位置:首页 > 编程语言 > Java开发

java填坑:三元操作符的类型不一致导致的问题

2017-08-10 17:47 225 查看
三元操作符是if-else的简化写法,我们在项目经常能用到他,但是有时候也容易出现问题,我们先看看下面这段代码:

int i = 80;
String str1 = String.valueOf(i < 100 ? 90 : 100);
String str2 = String.valueOf(i < 100 ? 90 : 100.0);

System.out.println("俩者相等:" + str1.equals(str2));


分析一下这段代码:i是80,那它当然小于100,两者的返回值肯定都是90,再转成 String类型,其值也绝对相等,毋庸置疑的。恩,分析得有点道理,但是变量str1中三元操作表达式中的第二个操作数是100,而str2的第二个操作数是100.0,难道没有影响吗?不可能有影响吧,三元操作符的条件都为真了,只返回第一个值嘛,与第二个值有一毛钱的关系吗?貌似有道理。

果真如此吗?我们通过结果来验证一下,运行结果是:“两者是否相等:false”,什么? 不相等,Why?

问题就出在100和100.0这两个数字上,在变量str1中,三元操作符中的第一个操作数 (90)和第二个操作数(100)都是int类型,类型相同,返回的结果也就是int类型的90, 而变str2的情况就有点不同了,第一个操作数是90(int类型),第二个操作数却是100.0(float类型),两个操作数的类型不一致。可三元操作符必须要返回一个数据。而且类型要确定,不可能条件为真时返回int类型,条件为假时返回float类型,编译器是不允许如此的,所以它就会进行类型转换了,int型转换为浮点数90.0,导致最终返回值是浮点数90.0。那这当然与整型的90不相等了。

那么,为什么是整型转为浮点,而不是浮点转为整型呢,这就涉及三元操作符类型的转换规則:

若两个操作数不可转换,则不做转换,返回值为Object类型

若两个操作数是明确类型的表达式(比如变量),則按照正常的二进制数字来转换,int 类型转换为long类型,long类型转换为float类型等

若两个操作数中有一个是数字S,另外一个是表达式,且其类型为T,那么,若数字S在T的范围内,則转换为T类型;若S超出了T类型的范围,则T转换为S类

若两个操作数都是直接量数字(Literal) 则返回值类型为范围较大者。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java