首页 > 解决方案 > Java 在评估表达式时的自动类型转换

问题描述

我已经弄清楚了以下几点:

  1. 1 + 2 + "3" 结果为 "33"
  2. 1 + 2 + '3' 的结果是 54,它是一个整数。

我无法理解 Java 在评估表达式时遵循哪些强制转换规则。

对我来说,Java 似乎确实将类型转换为类型层次结构中最接近的类型。在第一种情况下,int -> string发生,而char -> int在后一种情况下发生。

有人可以给出Java在这些情况下使用的正式规则吗?谢谢!

标签: java

解决方案


+左结合的,所以

a + b + c

总是被评估为

(a + b) + c

决定如何+应用运算符的规则是 JLS 15.18

  • 如果只有一个操作数+是 a String,则将另一个操作数转换为字符串,然后使用字符串连接。
  • 如果两个操作数都是数字(或可通过拆箱转换为数字),则操作数经过二进制数字提升,然后以数字相加。
  • 否则,编译器错误。

依次举你的例子:


(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.


推荐阅读