如果在三元运算符中使用局部变量,为啥从 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中三元运算符中的char转换,打印int值而不是char值