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的编程中找不到任何关于此的内容
答案 0 :(得分:19)
NotNull尚未完成。目的是将其演变为检查非零值的可用方法,但它尚未存在。目前我不会用它。我没有具体的预测,只有它不会到达2.8.0。
答案 1 :(得分:5)
尝试并错误:
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, 会员的价值必须初始化为a 值不同于null,否则为a 抛出scala.UnitializedError。
对于每个类型T,使得T&lt;: scala.AnyRef而不是T&lt;: scala.NotNull有scala.Null&lt;:T。