我是新來的斯卡拉,我很好奇爲什麼+
或+=
運營商返回Int
而不是Short
?我有一個簡單的 代碼如下所示,Scala上的運算符short return Int?
count :Short
count += 1.toShort
但+=
操作返回Int
,我假定這是故意的,想知道的原因。
我需要這個很短,因爲我將結果存儲在一個數據庫中,並且希望節省磁盤空間。我當然可以讓計算髮生在Int
之後,然後在存儲之前始終對結果調用.toShort
,但這有點直觀。
我是新來的斯卡拉,我很好奇爲什麼+
或+=
運營商返回Int
而不是Short
?我有一個簡單的 代碼如下所示,Scala上的運算符short return Int?
count :Short
count += 1.toShort
但+=
操作返回Int
,我假定這是故意的,想知道的原因。
我需要這個很短,因爲我將結果存儲在一個數據庫中,並且希望節省磁盤空間。我當然可以讓計算髮生在Int
之後,然後在存儲之前始終對結果調用.toShort
,但這有點直觀。
這幾乎肯定是因爲這是它在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給出選項的最簡單,最有效的方式。
Atul,好問題。這是我的想法 - 當我看着ScalaDoc for "Short",運營商+=
不在那裏。我猜這意味着編譯器可以幫助你一點,並將其轉換爲count = 1.toShort + count
。現在+
操作員總是返回一個Int
。 這有道理嗎?
這個問題在我回答後改變了。我現在的答案只針對第一部分。
希望仍然有幫助。
是的我想通了 - 但我無法調和的事實是,當我添加兩條短褲時,我得到一個Int回來。但是,如果它是Java語言限制,下面的答案是有意義的。 –
很高興你的答案! – Prashant
第二個報價是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 –