我是Scala的新手,我很好奇为什么+
或+=
运算符会返回Int
而不是Short
?我有一个简单的
代码如下,
count :Short
count += 1.toShort
但是+=
运算符返回Int
,我假设这是故意的,并想知道原因。
我需要将其缩短,因为我将结果存储在数据库中并希望节省磁盘空间。我当然可以在Int
中进行计算,然后在存储之前始终对结果调用.toShort
,但这有点反直觉。
答案 0 :(得分:4)
这几乎可以肯定是因为它是如何在Java和JVM字节码中处理的。将扩展扩展到integer
与在Java中处理它的方式一致,并且无需进行任何其他的转换操作。来自Java language specification
强调我的。 Java(语言)这样做的原因是因为JVM规范的编写方式。来自Java Virtual Machine Specification,应用扩展基元转换(第5.1.2节)来转换以下规则指定的一个或两个操作数:
- 如果任一操作数的类型为double,则另一个操作数转换为 双。
- 否则,如果任一操作数的类型为float,则另一个是 转换为浮动。
- 否则,如果任一操作数的类型为long,则为 其他被转换为长。
- 否则,两个操作数都将转换为 输入int。
请注意,表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
。
这有意义吗?
我回答后,问题发生了变化。我的答案现在只涉及第一部分。
希望仍有帮助。