java - Java 在评估表达式时的自动类型转换
问题描述
我已经弄清楚了以下几点:
- 1 + 2 + "3" 结果为 "33"
- 1 + 2 + '3' 的结果是 54,它是一个整数。
我无法理解 Java 在评估表达式时遵循哪些强制转换规则。
对我来说,Java 似乎确实将类型转换为类型层次结构中最接近的类型。在第一种情况下,int -> string发生,而char -> int在后一种情况下发生。
有人可以给出Java在这些情况下使用的正式规则吗?谢谢!
解决方案
+
是左结合的,所以
a + b + c
总是被评估为
(a + b) + c
决定如何+
应用运算符的规则是 JLS 15.18:
- 如果只有一个操作数
+
是 aString
,则将另一个操作数转换为字符串,然后使用字符串连接。 - 如果两个操作数都是数字(或可通过拆箱转换为数字),则操作数经过二进制数字提升,然后以数字相加。
- 否则,编译器错误。
依次举你的例子:
(1 + 2) + "3"
首先评估(1 + 2)
,并且它们都是数字,因此适用数字加法:它们是相同的类型,因此int
在二进制数字提升后它们仍然是 s ,产生3
。
3 + "3"
第二个操作数是 a String
,所以第一个被转换为 a String
,然后将两个字符串连接起来:
"33"
(1 + 2) + '3'
同样的事情发生在(1+2) = 3
.
'3'
是 a char
,它是一个数字类型,所以3
和'3'
进行二进制数字提升到int
,然后进行数字相加。(int) '3' == 51
, 所以3 + 51 = 54
.
推荐阅读
- firebase - Firebase 在函数目录中部署特定目录
- php - 如果额外的参数传递给它,如何使 Laravel 验证失败?
- javascript - jQuery 使用 for 循环触发事件 n 次
- python - python 安装 pandas-datareader 失败,找不到满足 Cython 要求的版本(来自版本:)
- angular - 从Angular 4中的详细信息页面导航回来后如何管理搜索页面的状态
- wordpress - 在 Wordpress 管理页面中对自定义列进行排序
- php - 试图在magento中点击类别时调用静态块
- r - ggplot:填充正态曲线下的小区域:删除“加入”区域
- java - Java 应用程序不响应代码更改
- javascript - 查询以从 MYsql 中的整个 json 对象中获取特定对象