【问题标题】:Operators on Scala short return Int?Scala 上的运算符短返回 Int?
【发布时间】:2015-08-28 18:32:08
【问题描述】:

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

count :Short
count += 1.toShort

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

我需要这个简短,因为我将结果存储在数据库中并希望节省磁盘空间。我当然可以让计算发生在 Int 中,然后在存储之前总是调用 .toShort 来处理结果,但这有点违反直觉。

【问题讨论】:

    标签: scala short


    【解决方案1】:

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

    加宽原语转换(第 5.1.2 节)适用于转换以下规则中指定的一个或两个操作数:

    • 如果任一操作数为 double 类型,则另一个将转换为 双倍。
    • 否则,如果任一操作数为浮点类型,则另一个为 转换为浮点数。
    • 否则,如果任一操作数的类型为 long,则 other 转换为 long。
    • 否则,两个操作数都转换为 输入整数。

    强调我的。 Java(语言)这样做的原因是因为 JVM 规范是如何编写的。来自Java Virtual Machine Specification

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

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

    【讨论】:

    【解决方案2】:

    阿图尔,好问题。以下是我的想法—— 当我查看ScalaDoc for "Short" 时,操作员+= 不存在。我猜这意味着编译器会帮助你一点并将其转换为count = 1.toShort + count。现在+ 运算符总是返回Int。 这有意义吗?

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

    希望仍然有帮助。

    【讨论】:

    • 是的,我想通了——但我无法接受这样一个事实,即当我添加两条短裤时,我得到了一个 Int 返回。但如果是 Java 语言限制,下面的答案是有意义的。
    • 很高兴你得到了答案!
    猜你喜欢
    • 2014-12-03
    • 2013-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    相关资源
    最近更新 更多