2014-09-11 28 views
1

我曾嘗試這兩個變量:Scala如何處理包含JVM基元值的元組?

val km = (1,2,4.3,false) 

val klpd = (1,2) 

在我看到Tuple2[Int,Int]第二種情況,但第一種情況下示出了在Tuple4[Integer,Integer,Double,Boolean]看到在的Intellij/Eclipse中的變量類型的存儲器即。

因此Scala將轉儲原始類型Int並將其存儲爲Integer。

如果我在Array[AnyVal]中添加一個Int,則會看到相同的結果。

PS:我使用Scala的2.10.4和我REPL輸出不匹配的Eclipse ..

+0

您使用的是什麼版本的Scala?我在2.11.2的REPL中得到'km:(Int,Int,Double,Boolean)=(1,2,4.3,false)'。 – 2014-09-11 13:26:18

+0

另外,'Int!= int' - 'Int'是'scala.lang.Int',而'Integer'是'java.lang.Integer'。有關更多詳細信息,請參見[此答案](http://stackoverflow.com/a/1271990/135978)。 – 2014-09-11 13:27:17

+0

將更新我的問題 – Dragonborn 2014-09-11 13:48:50

回答

7

在Scala中,元組是使用類採取泛型類型參數來表示。有22個這樣的類,但只有Tuple2被註釋爲專用(優化)原始類型。從Tuple3開始的任何東西,都會將原始圖塊封裝起來。

+0

我從未想過這件事。很高興知道。謝謝。 – roterl 2014-09-11 18:47:00

+0

爲什麼它只爲'Tuple2'完成? – Kigyo 2014-09-12 03:56:00

+1

@Kigyo我不知道確切的,我認爲這是'Tuple2'以上任何東西的生成的.class文件的數量。基本上,Scala編譯器將爲原始類型和引用類型的每個組合生成一個新類。有9種基本類型(unit,boolean,byte,char,short,int,long,float和double)加上1個引用類型。 'Tuple2'需要兩個參數。爲了說明所有可能的組合,編譯器必須生成10^2個類。這已經是一個很大的數字。想象一下'Tuple3','Tuple4'或善良禁忌'Tuple22'。 – 2014-09-12 08:37:31

相關問題