2010-02-25 22 views
12
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

+0

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

+2

'NotNull' realmente no funciona todavía. Por lo que yo sé, es un trabajo en progreso, muy parecido a 'Manifest' en Scala 2.7. –

+1

@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! –

Respuesta

5

Try y error:

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 

esto sólo funciona con 2.7.5 Scala :

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 y la Referencia del lenguaje Scala:

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

El corolario de esto es, entonces. ¿Por qué las clases propias de Scala (como 'List' no amplían el rasgo' NotNull'? –

+0

Y la otra pregunta, ¿cuál es "¿usa este rasgo?" –

+0

Si está implementando rasgos de Scala en Java (y en otros idiomas) el rasgo NotNull será ignorado. Otro aspecto es que una anotación @NotNull y un análisis de código estático estarán en Java 7. No veo otras razones para no usarlo en Scala libs. –

19

NotNull aún no ha terminado. La intención es evolucionar esto en una forma utilizable para verificar la ausencia de nulidad, pero aún no está allí. Por el momento no lo usaría. No tengo predicciones concretas cuando se hará, solo que no llegará para 2.8.0.

+6

¿Tengo razón al decir que ha estado en la biblioteca/lenguaje desde 2.5? No refleja bien que hay características en scala que simplemente no funcionan. –

+1

¿Se puede usar en scala 2.9.1? ? – Freewind

Cuestiones relacionadas