2015-08-17 12 views
13

Recentemente ho visto un po 'di codice come questo codice:sintetico Funzione "##" in scala

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

Beh, ok l'uscita è proprio il valore ASCI di 'a', ma consente di avere uno sguardo a

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

Il mio IDE dice su "##" che si tratta di una 'funzione sintetica'. Quindi cosa sta facendo e cos'è una funzione sintetica?

+0

penso che il suo solo l'abbreviazione di 'hashCode'. – Jus12

+0

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

risposta

15

E 'fondamentalmente un alias di hashCode, con un paio di eccezioni degne di nota che lo rendono un po' più sicuro:

Equivalente a x.hashCode tranne che per i tipi numerici in scatola e null. Per i numeri, restituisce un valore di hash che è coerente con l'uguaglianza dei valori: se due istanze di tipo valore vengono confrontate come vere, allora ## produrrà lo stesso valore di hash per ognuna di esse. Per null restituisce un codice hash dove null.hashCode genera uno NullPointerException.

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

Esempi:

valore normale

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

scala> x.hashCode 
res2: Int = 97 

scala> x.## 
res3: Int = 97 

valore nullo

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

scala> null.## 
res5: Int = 0 

Un campo sintetico, invece, è un campo generato dal compilatore per aggirare le limitazioni JVM sottostanti, specialmente quando si tratta di classi anonime interne, un concetto estraneo alla JVM.

Ecco una buona spiegazione di ciò che significa in dettaglio: http://javapapers.com/core-java/java-synthetic-class-method-field/

Problemi correlati