trait NotNull {}
que he estado tratando de ver cómo este rasgo puede garantizar que algo no es nulo y no puedo averiguarlo:¿Cómo funciona el rasgo NotNull en 2.8 y alguien realmente lo usa?
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
es evidente que existe un tratamiento de compilación especial porque esto compila:
trait MyTrait {}
def main(args: Array[String]) {
val i: MyTrait = null
println(i)
}
Considerando que esto No es:
def main(args: Array[String]) {
val i: NotNull = null //compile error: found Null(null) required NotNull
println(i)
}
EDIT:no hay nada de esto puedo encontrar en la programación en Scala
val a: NotNull = "asdf". Bloquea el compilador 2.7.5: Excepción en el hilo "principal" java.lang.AssertionError: assertion failed: type erro r: no se puede convertir de REFERENCE (java.lang.String) a REFERENCE (scala.NotNull) en la unidad –
'NotNull' realmente no funciona todavía. Por lo que yo sé, es un trabajo en progreso, muy parecido a 'Manifest' en Scala 2.7. –
@Daniel - bueno, ha estado en el lenguaje desde 2.5 de acuerdo con los documentos, ¡así que creo que debería estar funcionando ahora o simplemente será eliminado! –