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
Попытка и ошибка:
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 <: scala.AnyRef, а не T <: scala.NotNull, есть scala.Null <: T.
NotNull еще не закончен. Намерение состоит в том, чтобы превратить его в удобный способ проверки на не-нулевость, но он еще не готов. На данный момент я бы не стал его использовать. У меня нет конкретных прогнозов, когда это будет сделано, только то, что это не произойдет в версии 2.8.0.