2015-08-28 50 views
2

我是新来的斯卡拉,我很好奇为什么++=运营商返回Int而不是Short?我有一个简单的 代码如下所示,Scala上的运算符short return Int?

count :Short 
count += 1.toShort 

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

我需要这个很短,因为我将结果存储在一个数据库中,并且希望节省磁盘空间。我当然可以让计算发生在Int之后,然后在存储之前始终对结果调用.toShort,但这有点直观。

回答

4

这几乎肯定是因为这是它在Java和JVM Bytecode中的处理方式。将其推广到integer与在Java中处理它的方式一致,并且不需要执行任何额外的投射操作。从Java language specification

加宽原语转换(§5.1.2)被施加到转换的任一个或由下面的规则中指定的两个操作数:

  • 如果操作数的类型是双,另一种是转换为 双。
  • 否则,如果任一操作数的类型为float,则另一个是 转换为float。
  • 否则,如果任一操作数的类型是long,则其他的 将转换为long。
  • 否则,两个操作数都转换为 int类型。

强调我的。 Java(语言)这样做的原因是由于JVM规范的写法。从Java Virtual Machine Specification

另外,表2.2 大多数指令不具备整型字节,char和短形式。没有布尔类型的表单。编译器使用Java虚拟机指令对字节值类型为byte和short的负载进行编码,在编译时或运行时将这些值签名扩展到int类型的值。类型布尔型和字符型的字面值负载使用指令进行编码,该指令在编译时或运行时将文字零值扩展为int类型的值。同样,使用Java虚拟机指令对boolean,byte,short和char类型的值的数组进行加载,这些指令将值签名扩展或零扩展为int类型的值。因此,通过对计算类型int的值进行操作的指令正确执行对实际类型boolean,byte,char和short值的大多数操作。

强调我的。因此,斯卡拉这样做是因为它是使用JVM给出选项的最简单,最有效的方式。

+2

第二个报价是JVMS,而不是JLS。 SLS http://www.scala-lang.org/files/archive/spec/2.11/12-the-scala-standard-library.html#numeric-value-types以及有关扩大转化范围的旧讨论https:// groups .google.com/d/MSG /阶-内部/ GI-54GeWv-M/8nBSrrCIeQ4J –

0

Atul,好问题。这是我的想法 - 当我看着ScalaDoc for "Short",运营商+=不在那里。我猜这意味着编译器可以帮助你一点,并将其转换为count = 1.toShort + count。现在+操作员总是返回一个Int。 这有道理吗?

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

希望仍然有帮助。

+0

是的我想通了 - 但我无法调和的事实是,当我添加两条短裤时,我得到一个Int回来。但是,如果它是Java语言限制,下面的答案是有意义的。 –

+0

很高兴你的答案! – Prashant