2015-10-01 105 views
1

當他們說「盒裝數字類型什麼是scala docs for [email protected]####文檔中「boxed numeric」是什麼意思?

該帖從文檔是(突出礦):

相當於x.hashCode除了盒裝數值類型和空。 對於NUMERICS,則返回...

  1. 我認爲 「爲NUMERICS」 應改爲 「盒裝 NUMERICS」?
  2. 什麼是盒裝數字 - 它們的意思是Boxed[Int],例如?

這個問題讀Synthetic Function 「##」 in scala

我認爲一個value type is a subtype of scala.AnyVal並且不作爲對象實現之後是約,因此不盒裝

回答

2

hashCode方法用於java.lang.Object定義(或scala.AnyRef),但對原始(「未裝箱」)類型沒有等效。當您在原語上調用hashCode時,您將擁有盒裝類型的散列碼,例如,

3.0.hashCode // 1074266112 

這裏3.0 autoboxed到java.lang.Double,因此提供hashCode方法。

斯卡拉增加##允許基元的正確比較,例如,

3 == 3.0 // true 

這是因爲##是從哈希碼在這裏不同:

3.0.## // 3 ! 

爲參考值,##行爲一樣hashCode

"foo".##  // 101574 
"foo".hashCode // 101574 
+0

謝謝。在我原來的問題中,你是這樣說的:「* for numerics *」應該被解釋爲「*用於數字(盒裝或其他)*」;和* boxed數字類型*專指'java.lang.Number'的子類型的'java.lang'原始包裝類型?不是Scala的目標環境而不是JVM?那裏有個「盒裝數字型」的含義是什麼? – bejeb

+0

是的,是的。例如在JS中 - http://www.scala-js-fiddle.com/ - 'println(3.0.asInstanceOf [AnyRef] .hashCode)'會給你3. –

+0

從我可以看到的來自javap'##'在調用實用程序方法獲取結果之前,還會自動執行JVM中的雙字面值。這一切都有道理,謝謝。 – bejeb