java - 为什么字符串转换不是数字提升的一种?
问题描述
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”。我的意思是为什么字符串转换不包含在数字提升的第一优先级中?如果您认为主字符串后面的所有操作数都将转换为字符串,那么这是有道理的,前提是仅存在加法运算符。数字促销本身。
解决方案
在字符串连接的上下文中,您可以看到从数字类型到字符串的转换是一种提升形式。但是,在许多情况下,只有数字类型之间的转换而不是其他类型的转换是合适的,并且术语数字提升用于对这些类型的转换进行分类。
例如,将数字传递给期望 a 的方法String
并让该转换自动生效是不可取的,因为这肯定会导致错误增加,因为人们将错误的参数传递给他们的方法并且他们的代码仍然编译. 另一方面,将 a 传递int
给期望 a 的方法long
通常是合理的,用户通常期望得到的结果。
这意味着有一个特定的术语来描述数字类型之间的转换,而对于其他类型的转换有一个不同的术语,并且该特定术语用于其他类型的转换不合适的地方。
推荐阅读
- javascript - react-native-document-picker 应用程序在文档选择后关闭/崩溃
- java - 空手道:打印语句不使用 log4j2 写入控制台
- asp.net - Blazor Server:如何“监视文件更改”和“附加到 Visual Studio”
- rest - Odoo 中的 Odoo RPC、Xml RPC、JSON RPC 和 REST API 有什么区别?
- firebase - 参数类型“int”不能分配给参数类型“List”
'。使用 FieldValue.arrayUnion Firestore Flutter 时出错 - react-native - React Native将数据插入嵌套数组
- reactjs - 表单提交反应js时preventDefault不起作用
- java - 在 Java 中将方法作为参数传递给另一个方法是不好的做法吗?
- r - 有没有办法从 R 编写一个带有系数、se、p、优势比和 CI 的回归表?
- c# - 我可以轻松地将 AsObservable 连接到观察者吗