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
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à –
'NotNull' non funziona ancora veramente. Per quanto ne so, è un work in progress, molto simile a 'Manifest' in Scala 2.7. –
@Daniel - beh, è stato nella lingua dal 2.5 secondo i documenti, quindi penso che dovrebbe essere funzionante ormai o appena rimosso! –