为什么 String 转换不是 Numeric Promotion 的一种?

Why is String conversion not a type of Numeric Promotion?

Oracle 指定有关数值提升的

Numeric promotion (§5.6) brings the operands of a numeric operator to a common type so that an operation can be performed.

If either operand is of type double, the other is converted to double.

Otherwise, if either operand is of type float, the other is converted to float.

Otherwise, if either operand is of type long, the other is converted to long.

Otherwise, both operands are converted to type int.

Oracle 指定关于字符串转换

If only one operand expression is of type String, then string conversion (§5.1.11) is performed on the other operand to produce a string at run time. String conversion (§5.4) applies only to an operand of the binary + operator which is not a String when the other operand is a String.

我的问题是为什么数字促销中不包含字符串转换?如果您考虑此代码System.out.println("HELLO"+90+90.0F);,输出将是"HELLO9090.0F"(当然没有引号)。我完全理解这是如何工作的。由于 "HELLO" 是一个字符串,相应的操作数 90 也将被转换为一个字符串,因为存在 '+' 运算符。发生串联,因此给出 "HELLO90"。现在相应的操作数也将转换为字符串,因为存在“+”运算符。发生串联,给出 "HELLO9090.0F"。我的意思是为什么 String 转换不包含在 first priority 的 Numeric Promotion 中?如果您认为主字符串之后的所有操作数都将转换为字符串,那么这是有道理的,前提是只存在加法运算符。它应该在数字促销本身的第一优先级中提供。

字符串连接的上下文中, 您可以看到从数字类型到字符串的转换是一种提升形式。但是,在许多情况下, 数字类型之间的转换是合适的,而不是其他类型的转换,并且使用术语 numeric promotion对这些类型的转换进行分类。

例如,将数字传递给需要 String 的方法并让该转换自动生效是不可取的,因为随着人们通过他们的方法和他们的代码仍然编译的错误参数。另一方面,将 int 传递给期望 long 的方法通常是合理的,用户通常期望他们得到的结果。

这意味着有一个特定术语描述了数字类型之间的转换,还有一个不同的术语用于其他类型的转换,并且该特定术语用于某些地方其他类型的转换不合适。