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

时间:2025-03-27 10:10:42

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

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

    ("俩者相等:" + (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) 则返回值类型为范围较大者。