¿Cómo funciona el rasgo NotNull en 2.8 y alguien realmente lo usa?
trait NotNull {}
He estado tratando de ver cómo este rasgo puede garantizar que algo no sea nulo y no puedo entenderlo:
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 (*)
Y:
val i = new Object with NotNull //compile-error illegal inheritance
Obviamente hay un tratamiento especial de compilación en curso porque esto compila:
trait MyTrait {}
def main(args: Array[String]) {
val i: MyTrait = null
println(i)
}
Mientras que esto no:
def main(args: Array[String]) {
val i: NotNull = null //compile error: found Null(null) required NotNull
println(i)
}
EDITAR: no hay nada sobre esto que pueda encontrar en la programación en Scala