Как работает черта NotNull в 2.8 и кто-нибудь на самом деле ее использует? - PullRequest
12 голосов
/ 25 февраля 2010
trait NotNull {}

Я пытался понять, как эта черта может гарантировать, что что-то не является нулевым, и я не могу понять:

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

И

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

Очевидно, что происходит специальная обработка компилятора, потому что он компилируется:

trait MyTrait {}

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

Принимая во внимание, что это не так:

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

РЕДАКТИРОВАТЬ: нет ничего об этом я могу найти в программировании в Scala

Ответы [ 2 ]

19 голосов
/ 05 марта 2010

NotNull еще не закончен. Намерение состоит в том, чтобы развить это в пригодный для использования способ проверить ненулевое значение, но его еще нет. На данный момент я бы не использовал его. У меня нет конкретных прогнозов, когда это будет сделано, только то, что он не выйдет за 2.8.0.

5 голосов
/ 25 февраля 2010

Попытка и ошибка:

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

Это работает только с Scala 2.7.5:

scala> new Object with NotNull
res1: java.lang.Object with NotNull = $anon$1@39859

scala> val i = new Object with NotNull
i: java.lang.Object with NotNull = $anon$1@d39c9f

И справочник по языку Scala:

Если этот член имеет тип, который соответствует scala.NotNull, значение члена должно быть инициализировано значение отличается от нуля, в противном случае scala.UnitializedError выбрасывается.

Для каждого типа класса T такого, что T

...