简单接触Scala底层类型

开发 后端
本文节选自Martin Odersky,Lex Spoon和Bill Venners所著,Regular翻译的《Programming in Scala》的第十一章。Scala是一种针对 JVM 将函数和面向对象技术组合在一起的编程语言。

图释11.1类型层级的底部你看到了两个类scala.Null和Scala.Nothing。它们是用统一的方式处理某些Scala的面向对象类型系统的“边界情况”的特殊类型。

51CTO编辑推荐:Scala编程语言专题

类Null是null类型的引用;它是每个引用类(就是说,每个继承自AnyRef的类)的子类。Null不兼容值类型。你不可,比方说,把null值赋给整数变量:

  1. scala>val i: Int = null 
  2. < console>:4:error:typemismatch;  
  3. found:Null(null)  
  4. required:Int  
类型Nothing在Scala的类层级的***端;它是任何其它类型的子类型。然而,根本没有这个类型的任何值。要一个没有值的类型有什么意思呢?7.4节中讨论过,Nothing的一个用处是它标明了不正常的终止。例如Scala的标准库中的Predef对象有一个error方法,如下定义:

  1. def error(message:String): Nothing = throw new RuntimeException(message)  
error的返回类型是Nothing,告诉用户方法不是正常返回的(代之以抛出了异常)。因为Nothing是任何其它类型的子类,你可以非常灵活的使用像error这样的方法。例如:

  1. def divide(x:Int, y:Int): Int =  
  2.  if(y != 0) x / y  
  3.  else error("can't divide by zero")  

“那么”状态分支,x / y,类型为Int,而“否则”(else)分支,调用了error,类型为Nothing。因为Nothing是Int的子类型,整个状态语句的类型是Int,正如需要的那样。

【相关阅读】

  1. Scala的原始类型是如何实现的
  2. Scala的类层级
  3. Scala中的Spiral程序:把代码都螺旋在一起
  4. Scala中变高变宽的实现:heighten和widen
  5. 学习Scala的定义工厂对象

责任编辑:book05 来源: Artima
相关推荐

2009-11-17 11:14:25

Oracle扩展

2010-01-15 09:15:09

Scala Actor并发

2009-12-11 10:45:00

Scala讲座类型系统功能

2009-07-22 09:43:30

Scala类型

2009-06-10 09:29:40

Scala类型通配符

2009-06-03 09:08:20

ScalaJava类型

2009-07-21 09:31:00

Scala基本类型文本

2010-08-09 15:44:44

DB2 数据类型

2009-11-27 14:18:37

Scala

2009-07-09 00:25:00

Scala参数化

2009-12-11 10:43:00

Scala讲座混入多重继承类型层次

2009-09-17 11:35:40

Linq匿名类型

2009-09-11 10:16:07

Linq匿名类型

2009-11-19 10:43:54

Oracle Clob

2010-01-18 14:20:15

交换机接口类型

2009-07-08 12:43:59

Scala ServlScala语言

2010-07-05 16:13:34

2009-08-03 17:51:43

C#引用类型

2009-09-03 16:55:58

C#引用类型

2009-08-27 10:19:22

C#匿名类型
点赞
收藏

51CTO技术栈公众号