2015-08-28 35 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