Scala短操作符返回Int



我是Scala的新手,我很好奇为什么++=操作符返回Int而不是Short ?我有一个简单的代码如下,

count :Short
count += 1.toShort

但是+=操作符返回Int,我假设这是故意的,想知道原因。

我需要这个很短,因为我在数据库中存储结果,并希望节省磁盘上的空间。当然,我可以让计算在Int中进行,然后在存储结果之前总是调用.toShort,但这有点反直觉。

这几乎是肯定的,因为Java和JVM字节码就是这样处理的。将扩展提升到integer与Java中的处理方式是一致的,并且不需要进行任何额外的强制转换操作。来自Java语言规范

扩展原语转换(§5.1.2)适用于按照以下规则指定的一个或两个操作数转换:

  • 如果其中一个操作数为double类型,则另一个操作数转换为翻倍。
  • 否则,如果其中一个操作数为float类型,另一个操作数为float类型
  • 否则,如果其中一个操作数是long类型,则other转换为long。
  • 否则,两个操作数都转换为int类型。

我特别强调。Java(语言)这样做的原因是JVM规范的编写方式。来自Java虚拟机规范,

请注意,表2.2中的大多数指令都没有整数类型byte、char和short的形式。没有布尔类型的表单。编译器在编译时或运行时使用Java虚拟机指令符号扩展这些值为int类型的值,对字节类型和短类型的文字值进行编码。布尔类型和char类型的文字值的加载是使用在编译时或运行时将文字零扩展为int类型的指令进行编码的。同样地,从布尔类型、字节类型、短类型和char类型的值的数组中加载的数据也使用Java Virtual Machine指令进行编码,这些指令将值进行符号扩展或零扩展,以转换为int类型的值。因此,对布尔型、字节型、char型和short型实际类型的值的大多数操作,都可以由对int型计算型的值进行操作的指令正确执行。

再次强调我。所以Scala这样做是因为这是使用JVM提供的选项的最简单、最有效的方法。

很好,问得好。以下是我的想法当我在ScalaDoc中查找"Short"时,操作符+=不在那里。我猜这意味着编译器帮助你一点,并将其翻译为count = 1.toShort + count。现在,+运算符总是返回Int。明白了吗?

我回答后问题变了。我的回答现在只针对第一部分。

希望还能帮到你。

最新更新