Nothing,Null, Unit in Scala

Nothing

Nothing在Scala中是所有类型的子类,处于类型系统的底部(botoom type),表示没有任何值的类型,也被称为zero or empty type,常用数学符号⊥来表示。如果一个函数的返回值是Nothing,表示函数不会返回。如:函数抛出异常、进入死循环或者退出程序。

1
2
def error(message: String): Nothing =
  throw new RuntimeException(message)

Unit

Unit类似于别的语言中的void。如果一个函数返回Unit,表示它不返回有意义的值,这种函数也被称为过程(procedure)。Unit也可以作为函数的参数,表示不接收任何有意义的参数。与Nothing的区别在于,它不会是所有类型的子类,并且它是有值的,在Scala中写作()

1
2
3
4
5
6
7
def sayHello(): Unit =
  println("Hello")

// 简写
def sayHello() {
  println("Hello")
}

Null

Null有且仅有一个值null,它是所有引用类型(reference class)的子类。表示空引用。可以将Null值转换为任何引用类型值。但是不能将Nothing值转为任何类型值,因为Nothing没有值,这是他们之间最根本的区别——程序无法得到一个Nothing的值。在Scala中已经尽量避免使用null,提倡使用Option/Some/None替代。

在Scala类型系统中,Any是任何类型的父类(包括值类型),Nothing是任何类型的子类(同样包括值类型),这样便将值类型和引用类型统一起来。任何一个类型都在AnyNothing之间。这是比Java更加一致的地方。

在Scala中还有几个有意思的类:

  • object Nil extends List[Nothing]代表一个空List,单例实现,由于Scala中List是协变的,它是任何List[T]的子类。
  • object None extends Option[Nothing]代表没有值,与Some相对。