首页 > 解决方案 > 为什么字符串转换不是数字提升的一种?

问题描述

Oracle 指定关于数字提升

数值提升(第 5.6 节)将数值运算符的操作数变为通用类型,以便可以执行操作。

如果任一操作数是 double 类型,则另一个操作数将转换为 double。

否则,如果任一操作数的类型为浮点型,则另一个将转换为浮点型。

否则,如果任一操作数是 long 类型,则另一个将转换为 long。

否则,两个操作数都转换为 int 类型。

Oracle 指定关于字符串转换的

如果只有一个操作数表达式是字符串类型,则对另一个操作数执行字符串转换(第 5.1.11 节)以在运行时生成字符串。字符串转换(第 5.4 节)仅适用于二进制 + 运算符的操作数,当另一个操作数是字符串时,该操作数不是字符串。

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

标签: javastringstring-conversiontype-promotion

解决方案


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

例如,将数字传递给期望 a 的方法String并让该转换自动生效是不可取的,因为这肯定会导致错误增加,因为人们将错误的参数传递给他们的方法并且他们的代码仍然编译. 另一方面,将 a 传递int给期望 a 的方法long通常是合理的,用户通常期望得到的结果。

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


推荐阅读