Java基础进阶系列-08之结合JLS深度解读三目运算符

本文详细探讨了Java中三目运算符的类型一致性原则,通过案例分析展示了类型不一致会导致的编译错误。同时,文章深入解读了JLS(Java Language Specification)关于三目运算符的转换规则,包括布尔条件表达式、数字型表达式和引用条件表达式,并提醒开发者注意避免因类型对齐产生的自动拆箱可能导致的NPE异常。
摘要由CSDN通过智能技术生成

三目运算符,从代码逻辑上看,其实就是if-else条件判断语句的简化版。

一、三目运算符的类型务必一致

观察以下代码案例,看看两者是否相等

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

从直观第一感觉来看,i < 100这一表达式的结果在此处肯定为true,那么它自然会走第二个操作数表达式,返回的都是90,再转成String类型,两者的值应该是相等的。分析地确实有道理。

不过,第三个操作数表达式分别是100100.0,它们真的就不会影响到我们返回的结果吗?

不会吧不会吧。

案例分析

  • 对于String.valueOf(i < 100 ? 90 : 100),第二个操作数表达式和第三个操作数表达式都是int类型类型相同,那么返回的结果就是int类型的90

  • 对于String.valueOf(i < 100 ? 90 : 100.0),第二个操作数表达式为int类型,第三个操作数表达式为浮点数,两个操作数表达式类型不一致。

  • 但是三目运算符要求我们返回一个值,并且是类型确定的,不会出现当条件为true时返回int类型,条件为false时返回float类型的情况,编译器是不会允许我们这么做的,此时就会进行类型转换,将int类型90转换为浮点数90.0,并返回。

自然就和String.valueOf(i < 100 ? 90 : 100)情况下得到的返回值不一样。

  • 为何是整型转换为浮点数类型,而不是浮点数转为整型呢?

我们通过解读Java Language Specification语言规范,来探究三目运算符的转换规则。

二、代码案例分析

  • 代码案例1
public static void main(String[] args) {
   
    int a = 1;
    int b = 1;

    // int类型(9)转换为double类型(9.0D)
    System.out.println(a == b ? 9.9 : 9);
    // (98)在char取值范围内,转换为对应ASCII码
    System.out.println
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值