Scala上的运算符短暂返回Int?

时间:2015-08-28 18:32:08

标签: scala short

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

count :Short
count += 1.toShort

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

我需要将其缩短,因为我将结果存储在数据库中并希望节省磁盘空间。我当然可以在Int中进行计算,然后在存储之前始终对结果调用.toShort,但这有点反直觉。

2 个答案:

答案 0 :(得分:4)

这几乎可以肯定是因为它是如何在Java和JVM字节码中处理的。将扩展扩展到integer与在Java中处理它的方式一致,并且无需进行任何其他的转换操作。来自Java language specification

  

应用扩展基元转换(第5.1.2节)来转换以下规则指定的一个或两个操作数:

     
      
  • 如果任一操作数的类型为double,则另一个操作数转换为   双。
  •   
  • 否则,如果任一操作数的类型为float,则另一个是   转换为浮动。
  •   
  • 否则,如果任一操作数的类型为long,则为   其他被转换为长。
  •   
  • 否则,两个操作数都将转换为   输入int。
  •   
强调我的。 Java(语言)这样做的原因是因为JVM规范的编写方式。来自Java Virtual Machine Specification

  

请注意,表2.2 中的大多数指令没有整数类型byte,char和short的表单。没有布尔类型的表单。编译器使用Java虚拟机指令对字节和字节类型的文字值进行编码,这些指令在编译时或运行时签名 - 将这些值扩展为int 类型的值。 boolean和char类型的文字值的加载使用在编译时或运行时将文字零扩展为int类型的指令进行编码。同样,来自boolean,byte,short和char类型值的数组的加载使用Java虚拟机指令进行编码,这些指令将值符号扩展或零扩展为int类型的值。因此,对实际类型boolean,byte,char和short的值的大多数操作都是通过对计算类型int 的值进行操作的指令正确执行的。

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

答案 1 :(得分:0)

Atul,好问题。这是我的想法 - 当我查看ScalaDoc for "Short"时,操作员+=不在那里。我猜这意味着编译器可以帮助您并将其转换为count = 1.toShort + count。现在,+运算符始终返回Int。 这有意义吗?

我回答后,问题发生了变化。我的答案现在只涉及第一部分。

希望仍有帮助。