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
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 –
'NotNull' jeszcze nie działa. O ile mi wiadomo, jest to praca w toku, podobnie jak "Manifest" w Scali 2.7. –
@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! –