2015-08-17 113 views
13

最近我看到這樣的代碼一些代碼:合成功能「##」在斯卡拉

val x: Any = "a" 
val y = x.## // y: Int = 97 

嗯,OK輸出僅僅是「A」的ASCI值,但讓我們看看

List(1,2).## // Int = 985731359 
List(1,2).toString.## // Int = 1063384434 

我的IDE告訴'##'它是'合成函數'。那麼,##在做什麼以及什麼是合成函數?

+0

我認爲它只是簡稱'hashCode'。 – Jus12

+0

http://www.scala-lang.org/api/current/index.html#scala.Any – ccheneson

回答

15

它基本上的hashCode別名,與幾個顯着的例外,使得它有點更安全的:

相當於x.hashCode除了盒裝數值類型和null。對於數字,它會返回一個與值相等的散列值:如果兩個值類型實例比較爲true,則##會爲它們中的每一個生成相同的散列值。對於null會返回一個散列碼,其中null.hashCode將拋出一個NullPointerException

(來源:http://www.scala-lang.org/api/current/index.html#[email protected]##():Int

實例:

正常值

scala> val x: Any = "a" 
x: Any = a 

scala> x.hashCode 
res2: Int = 97 

scala> x.## 
res3: Int = 97 

空值

scala> null.hashCode 
java.lang.NullPointerException 
    ... 33 elided 

scala> null.## 
res5: Int = 0 

相反,合成字段是編譯器生成的一個字段,用於解決底層JVM限制,特別是在處理內部匿名類時,這是與JVM無關的概念。

這裏是什麼意思在細節方面有着出色的解釋:http://javapapers.com/core-java/java-synthetic-class-method-field/