繁体   English   中英

Java三元运算符不工作?

[英]Java ternary operator not working?

假设我们有一个StringBuilder和一个double。 现在想要追加双倍。 如果double可以表示为Integer(例如3.0,5.0等),我想将其添加为Integer,否则为double。

实现这一目标的第一种方法是:

StringBuilder sb = new StringBuilder();
double d = 3.5;

if (d % 1 == 0) sb.append((int) d);
else sb.append(d);

System.out.println(sb.toString());

这工作还是不错的,当d3.0 3将被追加,如果d3.5 3.5会被追加。

现在我想用三元运算符做这个:

StringBuilder sb = new StringBuilder();
double d = 3.5;

sb.append(d % 1 == 0 ? (int) d : d);

System.out.println(sb.toString());

所以现在我有一个问题,每次,如果double是3.03.5 ,它将被添加为double值! 只有当我理论上强加于truefalse它才有效......但每次都不是我想要的。 这是什么问题? 为什么三元运算符不起作用?

JLS - 15.25中记录了此行为。 条件运算符? ::

如果其中一个操作数是T类型,其中T是byte,short或char,另一个操作数是int类型的常量表达式(第15.28节),其值可以在类型T中表示,那么条件表达式的类型是Ť

当你写作

(a > b) ? 'a' : 65

第二种类型转换为char。

通过JLS,它解释了其他情况下的行为(相同的方法)。

这种行为的原因是具有三元运算符的表达式具有明确定义的类型。 JLS详细描述了如何评估此类型,但粗略地说,它是冒号前表达式类型的最小上限和冒号后表达式的类型。

例如,如果bbooleaniintddouble ,那么b ? i : d的类型是b ? i : d b ? i : ddouble ,因为doubleintdouble的最小上限。 当你在StringBuilder上调用append( b ? i : d )时,你会得到带有double参数的append版本。 你的情况也是如此, d % 1 == 0 ? (int) d : d d % 1 == 0 ? (int) d : d

在原始数字上使用三元运算符时,第二和第三个操作数受二进制数字提升。 在您的情况下, int被强制转换为double 这在JLS#15.25中指定。

方法StringBuilder.append()对于不同类型的参数有许多重载。 使用哪种方法重载是编译时决策。 三元运算符的结果只有一个类型,在这种情况下是intdouble - double

对于if语句,编译器根据分支使用正确的append()方法重载。

我认为编译器将sb.append(d % 1 == 0 ? (int) d : d)视为sb.append(double) ,否则将sb.append((int) d)视为sb.append(int)

数字条件表达式是独立表达式(第15.2节)。

数字条件表达式的类型确定如下:

如果第二个和第三个操作数具有相同的类型,那么这就是条件表达式的类型。

如果第二个和第三个操作数之一是原始类型T,而另一个操作数的类型是对T应用装箱转换(第5.1.7节)的结果,那么条件表达式的类型是T.

如果其中一个操作数的类型为字节或字节,另一个操作数的类型为short或Short,则条件表达式的类型为short。

如果其中一个操作数是T类型,其中T是byte,short或char,另一个操作数是int类型的常量表达式(第15.28节),其值可以在类型T中表示,那么条件表达式的类型是T.

如果其中一个操作数是T类型,其中T是Byte,Short或Character,另一个操作数是int类型的常量表达式,其值可以在类型U中表示,这是将拆箱转换应用于T的结果,那么条件表达式的类型是U.

否则,二进制数字提升(第5.6.2节)将应用于操作数类型,条件表达式的类型是第二个和第三个操作数的提升类型。

这些类型将转换为相应的原始类型,称为拆箱。 如果一个操作数是常量int(在取消装箱之前不是整数),其值可以在另一个类型中表示,则int操作数将转换为另一个类型。 否则,较小的类型将转换为下一个更大的类型,直到两个操作数具有相同的类型。 转换订单是:

byte - > short - > int - > long - > float - > double

char - > int - > long - > float - > double

最终,整个条件表达式获得其第二个和第三个操作数的类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM