在Scala中存在两个比拟非凡的类,Scala.Null和Scala.Nothing。它们是Scala面向对象的类型零碎用于解决一些“极其状况”的非凡类型。

Null类是null援用的类型,他是每个援用类(即继承自AnyRef的类)的子类,null值能够用来给援用类初始化。然而Null并不兼容于值类型,即你不可能将null赋值给一个整数变量:

val i: Int = null

以上写法是不对的。

Nothing位于Scala类继承关系的最底部,它是每个其余类型的子类型,并且,不存在这个类型的任何值。那么,Nothing类型的意义何在呢?

Scala中的底类型(bottom types)
作为参数类型。
在Scala的List中有一个非凡的存在,Nil,如果应用过Nil你就会发现,Nil实际上就是一个List[Nothing]。所以Nil能够与任何类型的元素进行汇合的相干操作,例如1 ::Nil,”abc” :: Nil,最终失去的汇合后果会依据增加的元素类型决定,因为Nothing是任何类的子类,它能够被归为任何List中去。

非正常终止信号
在Scala中抛出异样跟Java一样,须要创立一个异样对象而后用throw关键字将它抛出:

throw new IllegalArgumentException

并且,在Scala中,抛出异样的动作throw是一个有后果类型的表达式,这个后果的类型就是Nothing。如下示例:

val half:Int =

If ( n % 2 == 0)

n / 2

else

throw new RuntimeException(“n must be even”)

在这段代码中,如果n是偶数,那么half会被赋值为n的一半,如果n不是偶数那么half被初始化之前,就会有异样抛出。而你如此写不必放心half的类型问题,因为技术上讲,抛出异样这个表达式的类型是Nothing。在这个场景下,if的一个分支计算出某个值,而另一个分支抛出异样并计算出Nothing,整个if表达式的类型就是那个计算出某个值的分支。

再举例来说,在Scala的规范类库中Predef对象有一个error办法,其定义如下:

def error(message:String):Nothing =

throw new RuntimeException(message)

error办法的返回值类型是Nothing,这通知应用方该办法并不会失常返回,它会抛出异样。对error的应用如下:

def divide(x: Int, y: Int): Int =

if (y != 0) x / y

else error(“can’t divide by zero”)

这里的x/y条件判断的then分支的类型为Int,而else分支类型为Nothing,因为Nothing是Int的子类型,整个条件判断表达式的类型就是Int,正如办法申明要求的那样。

关键词:大数据培训