如果在三元运算符中使用局部变量,为啥从 int 到 short 的缩小转换不起作用

Posted

技术标签:

【中文标题】如果在三元运算符中使用局部变量,为啥从 int 到 short 的缩小转换不起作用【英文标题】:Why does the narrowing conversion from int to short not work if local variable is used in the ternary operator如果在三元运算符中使用局部变量,为什么从 int 到 short 的缩小转换不起作用 【发布时间】:2015-11-11 12:18:59 【问题描述】:

以下代码行被编译器 (sun-jdk-8u51) 接受,没有任何警告或错误:

short b = true ? 1 : 1;

而接下来的两行代码会导致编译错误(不兼容的类型:从 int 到 short 的可能有损转换):

boolean bool = true;
short s = bool ? 1 : 1;

为什么编译器无法在第二种情况下执行与原始整数 1 相同的narrowing conversion?

【问题讨论】:

这是因为在第一种情况下,由于 true 是编译时常量,整个表达式在编译时进行评估,所以你基本上有 short b = 1; 而在第二个版本中,编译器不会为您进行简化,因此会出现错误。 相关(可能是骗人的):***.com/questions/4711431/… assignment conversion - 如果表达式是常量表达式...可以使用缩小原始转换... groups.google.com/forum/#!topic/java-lang-fans/0zGzPygyJSU @aioobe 你不能回答这个问题吗? 【参考方案1】:

正如@aioobe 在 cmets 中所述:

这是因为在第一种情况下,由于 true 是编译时常量,整个表达式在编译时进行评估,所以你基本上有 short b = 1; 而在第二个版本中,编译器不做简化对你来说,因此错误

final添加到变量bool的声明中使其成为一个常量变量,这也允许编译器如上所述解释代码。

final boolean bool = true;
short s = bool ? 1 : 1;

见section 4.12.4

【讨论】:

以上是关于如果在三元运算符中使用局部变量,为啥从 int 到 short 的缩小转换不起作用的主要内容,如果未能解决你的问题,请参考以下文章

学习笔记1(三元运算深浅拷贝动态参数全局变量与局部变量set数据类型 )

java基础知识

Java中三元运算符中的char转换,打印int值而不是char值

为啥你可以在函数中使用另一种方法而不是赋值运算符来更改 Ruby 中局部变量的值?

三元运算符为啥以及何时返回左值?

直接使用运算符的地址与使用指针变量返回局部变量的地址