三目运算符的返回值类型

三目运算符的返回值类型

三目运算符的基本语法和用途就不再赘述了, 本篇本章主要讨论Java中三目运算符的返回值

条件 ? 返回值1 : 返回值2 

先来看一段测试代码:

System.out.println(true ? 1 : 3.14);  // out: 1.0

上述代码输出的是浮点数1.0,可能感到疑惑,难道不应该输出整数1吗?

其实在编译时, 就已经确定了三目运算的返回值类型,而且只能是一种类型,不管你的三目条件判断为true 或 false 都是返回同一种类型。这就类似Java中的方法只能返回一种类型的数据。

上面代码中返回值1的类型为int, 返回值2的类型为double, 为了做到返回同一种类型, 编译器自动寻找了这两种类型的相同父类——double(int类型可以自动向上转为double),于是最终的返回值类型就是double


Object obj1 = true ? 1 : 3.14;
System.out.println(obj1 instanceof Integer); // false
System.out.println(obj1 instanceof Double);  // true

上面的代码证明了这一想法。


更多的测试例子:

System.out.println(true ? 1 : 2);			// 1
System.out.println(true ? 1 : 2.0);			// 1.0
System.out.println(true ? 'a' : 2L);		// 97L
System.out.println(true ? 'a' : 2);			// a
System.out.println(true ? 'a' : Character.MAX_VALUE);		// a
System.out.println(true ? 'a' : Character.MAX_VALUE + 1);	// 97

总结:

  1. 如果返回值1和返回值2都是同种类型,那么三目最终的返回类型就是这种类型
  2. 如果返回值1和返回值2不是同种类型,那么三目最终的返回类型是这两种类型的相同最小父类(最接近的父类,如果没有则返回Object,例如Integer和String最终返回的将是Object)。
  3. 对于基本数据类型,有点特殊。如果一个返回值类型为T(T为byte,char或short),另一个为int的常数,那么如果这个常数值在T的取值范围内,则三目最终的返回类型为T,如果常数值不在T的取值范围内,则返回发生自动类型转换(从上面测试代码的最后四条中可以看到)。

总结一下就是,三目运算符没有我们想象的那么简单,其中类型转换的“潜规则”也需要深入了解底层。如果在开发中需要使用三目运算符,那么就尽量让它的返回值相同吧。

  • 9
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值