2010-02-25 11 views
12
trait NotNull {} 

Ho cercato di vedere come questo tratto può garantire che qualcosa non è nullo e non riesco a capirlo:Come funziona il tratto NotNull in 2.8 e qualcuno lo usa effettivamente?

def main(args: Array[String]) { 
    val i = List(1, 2) 
    foo(i) //(*) 
} 

def foo(a: Any) = println(a.hashCode) 

def foo(@NotNull a: Any) = println(a.hashCode) //compile error: trait NotNull is abstract 

def foo(a: Any with NotNull) = println(a.hashCode) //compile error: type mismatch at (*) 

E:

val i = new Object with NotNull //compile-error illegal inheritance 

c'è ovviamente un trattamento speciale compilatore succedendo perché questo compila:

trait MyTrait {} 

def main(args: Array[String]) { 
    val i: MyTrait = null 
    println(i) 
} 

considerando che la presente do Non es:

def main(args: Array[String]) { 
    val i: NotNull = null //compile error: found Null(null) required NotNull 
    println(i) 
} 

EDIT:non c'è niente su questo posso trovare in programmazione a Scala

+0

val a: NotNull = "asdf". Arresta il compilatore 2.7.5: Eccezione nel thread "main" java.lang.AssertionError: assertion failed: digita erro r: impossibile convertire da REFERENCE (java.lang.String) a REFERENCE (scala.NotNull) nell'unità

+2

'NotNull' non funziona ancora veramente. Per quanto ne so, è un work in progress, molto simile a 'Manifest' in Scala 2.7. –

+1

@Daniel - beh, è ​​stato nella lingua dal 2.5 secondo i documenti, quindi penso che dovrebbe essere funzionante ormai o appena rimosso! –

risposta

5

Prova ed errore:

scala> class A extends NotNull 
defined class A 

scala> val a : A = null 
<console>:5: error: type mismatch; 
found : Null(null) 
required: A 
     val a : A = null 
       ^

scala> class B 
defined class B 

scala> val b : B = null 
b: B = null 

questo funziona solo con Scala 2.7.5 :

scala> new Object with NotNull 
res1: java.lang.Object with NotNull = [email protected] 

scala> val i = new Object with NotNull 
i: java.lang.Object with NotNull = [email protected] 

A nd the Scala Reference Reference:

If that member has a type which conforms to scala.NotNull, the member’s valuemust be initialized to a value different from null, otherwise a scala.UnitializedError is thrown.

For every class type T such that T <: scala.AnyRef and not T <: scala.NotNull one has scala.Null <: T.

+2

Il corollario di questo è, quindi. Perché le classi proprie di scala (come 'List' non estendono il tratto' NotNull'? –

+0

E l'altra domanda, che è "usi questa caratteristica?" –

+0

Se stai implementando tratti Scala in Java (e in altre lingue) il tratto NotNull verrà ignorato.Un altro aspetto è che un'annotazione @NotNull e l'analisi del codice statico saranno in Java 7. Non vedo altri motivi per non usarlo nelle librerie Scala. –

19

NotNull non è ancora terminato. L'intenzione è di evolvere questo in un modo utilizzabile per verificare la non nullità, ma non è ancora lì. Per il momento non lo userei. Non ho previsioni concrete quando sarà fatto, solo che non arriverà per 2.8.0.

+6

Ho ragione nel dire che è in libreria/lingua da 2.5? Non riflette bene che ci sono funzionalità in scala che semplicemente non funzionano. –

+1

È utilizzabile in scala 2.9.1 ? – Freewind

Problemi correlati