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

Próbowałam zobaczyć, jak ta cecha może zagwarantować, że coś nie jest nieważna i nie mogę zrozumieć to:W jaki sposób funkcja NotNull działa w wersji 2.8 i czy ktokolwiek z niej korzysta?

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 (*) 

oraz:

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

Istnieje oczywiście niektóre szczególne traktowanie kompilator dzieje, bo to kompiluje:

trait MyTrait {} 

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

Podczas gdy to zrobić es nie:

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

EDIT:nie ma nic na ten temat można znaleźć w programowaniu w Scala

+0

val a: NotNull = "asdf". Uszkadza kompilator 2.7.5: wyjątek w wątku "główny" java.lang.AsersertError: asercja nie powiodła się: wpisz erro r: nie można przekonwertować z polecenia REFERENCJE (java.lang.String) na REFERENCJĘ (scala.NotNull) w jednostce

+2

'NotNull' jeszcze nie działa. O ile mi wiadomo, jest to praca w toku, podobnie jak "Manifest" w Scali 2.7. –

+1

@Daniel - cóż, w języku od 2.5 według dokumentów, więc myślę, że powinno to działać już teraz lub po prostu zostać usunięte! –

Odpowiedz

5

spróbować błąd:

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 

ta działa tylko z 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 Odniesienie do języka 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

Następstwem tego jest zatem. Dlaczego własne klasy scala (takie jak 'List' nie rozszerzają cechy' NotNull'? –

+0

I inne pytanie, które jest "czy używasz tej cechy?" –

+0

Jeśli używasz cech Scala w Javie (i innych językach) cecha NotNull zostanie zignorowana.Innym aspektem jest to, że adnotacja @NotNull i statyczna analiza kodu będą w Javie 7. Nie widzisz innych powodów, aby nie używać go w bibliotekach Scala –

19

NotNull jeszcze się nie zakończył. Intencją jest przekształcenie tego w użyteczny sposób sprawdzenia nie-zerowości, ale jeszcze jej nie ma. Na razie nie skorzystam z tego. Nie mam konkretnych przewidywań, kiedy to nastąpi, tylko że nie dotrze on do wersji 2.8.0.

+6

Mam rację mówiąc, że jest w bibliotece/języku od 2.5? Nie odzwierciedla to dobrze, że w scali są funkcje, które po prostu nie działają –

+1

Czy można go używać w scala 2.9.1 ? – Freewind

Powiązane problemy