收集实际开发项目中常见的Java问题,持续更新…

三元操作的类型必须一致。

1
2
3
4
5
6
7
public static void main(String[] args) {
Integer i = 80;
String s1 = String.valueOf(i < 100 ? 90 : 110);
String s2 = String.valueOf(i < 100 ? 90 : 110.0);

System.out.println(s.equals(s1));
}

请看上面这段程序,i=80,小于100肯定成立,s1=90,s2=90,此题毋庸置疑肯定是返回true。运行结果刚好相反,返回false。仔细一分析s2中90为int类型,而110.0为float类型。在三元操作中对于两个类型不一致的时候会这么处理呢。s1中90为int类型,110也为int类型。返回值为int类型,然后转换为String类型
s1=90,s2中,90为int类型110.0为float类型,结果会int类型会转为float类型为90.0,然后转为String类型。那么90和90.0肯定就不想等了。那么为什么是int类型转float类型而不是float转int呢。这就要看三元操作的类型转换规则了:

  • 如果两个操作数不可转换,那么就不进行转换,返回Object类型。
  • 如果两个操作数是明确类型的表达式,则按照正常的二进制数字来转换,int转long,long转float
  • 如果两个操作数都是直接量数字,则返回范围较大的。
  • 如果两个操作数中有一个是数字S,另外一个是表达式,且其类型示为T,如果数字S在T的范围内,则转换为T,反之则T转换为S
    所以我们在实际开发中还是尽量保证三元操作的类型保持一致。