在图释11.1类型层级的底部你看到了两个类scala.Null和Scala.Nothing。它们是用统一的方式处理某些Scala的面向对象类型系统的“边界情况”的特殊类型。
51CTO编辑推荐:Scala编程语言专题
类Null是null类型的引用;它是每个引用类(就是说,每个继承自AnyRef的类)的子类。Null不兼容值类型。你不可,比方说,把null值赋给整数变量:
类型Nothing在Scala的类层级的***端;它是任何其它类型的子类型。然而,根本没有这个类型的任何值。要一个没有值的类型有什么意思呢?7.4节中讨论过,Nothing的一个用处是它标明了不正常的终止。例如Scala的标准库中的Predef对象有一个error方法,如下定义:
- scala>val i: Int = null
- < console>:4:error:typemismatch;
- found:Null(null)
- required:Int
error的返回类型是Nothing,告诉用户方法不是正常返回的(代之以抛出了异常)。因为Nothing是任何其它类型的子类,你可以非常灵活的使用像error这样的方法。例如:
- def error(message:String): Nothing = throw new RuntimeException(message)
- def divide(x:Int, y:Int): Int =
- if(y != 0) x / y
- else error("can't divide by zero")
“那么”状态分支,x / y,类型为Int,而“否则”(else)分支,调用了error,类型为Nothing。因为Nothing是Int的子类型,整个状态语句的类型是Int,正如需要的那样。
【相关阅读】