2012-04-09 5 views
7

Ho appena letto this question e siamo capitati la seguente citazione:Può essere nullo in Scala?

Scala tratta == come se fosse definita come segue in classe Any:

final def == (that: Any): Boolean = 
    if (null eq this) (null eq that) else (this equals that) 

La (null eq this) parte mi ha fatto meraviglia: E ' è effettivamente possibile chiamare metodi su puntatori nulli? this è null in Scala?

+1

Stai confondendo l'astrazione con l'implementazione. In astratto, si possono chiamare metodi su 'null', come' == '. L'implementazione sulla JVM, ovviamente, non richiama i metodi su un puntatore nullo. –

risposta

8

Scopri la Scala language specification, cioè 6.3 il valore NULL capitolo:

Il valore nullo è di tipo scala.Null, ed è quindi compatibile con tutti i riferimenti tipo. Denota un valore di riferimento che si riferisce a uno speciale "null" oggetto. Questo oggetto implementa metodi nella classe scala.AnyRef come segue:

eq(x) e ==(x) return true se l'argomento x è anche l'oggetto “nullo”.

ne(x) e !=(x) restituiscono true se l'argomento x non è anche l'oggetto "null".

Questo significa che semanticamente quando si confronta con qualcosa null letterale o null letterale con qualcosa in realtà si riferisce a metodo di una speciale classe di scala.Null. Tratti letterale null come una scorciatoia per quella classe.

Naturalmente a livello di implementazione è ottimizzato e viene utilizzato ordinarionull.

3

null è l'unica istanza della classe Null ed è un oggetto valido. Null è un sottotipo di tutti i tipi di riferimento.

1

Sono piuttosto nuovo di Scala, ma l'unico modo che vedo come possibile è dovuto al fatto che "null" è di per sé un'istanza di Null, e non esattamente un valore speciale come "null" in Java .

http://blog.sanaulla.info/2009/07/12/nothingness/

In questo articolo mi ha aiutato a capire questo un po 'meglio.