scala学习手记18 - Any和Nothing

Any

前面已经有两次提到过:在scala中,Any类是所有类的超类。

Any有两个子类:AnyVal和AnyRef。对应Java直接类型的scala封装类,如Int、Double等,AnyVal是它们的基类;对应引用类型,AnyRef是它们的基类。

scala中,所有类的关系可以用下面这张图大致描述下:

3RTDt3VOau69lT

Any是一个抽象类,它有如下方法:!=()、==()、asInstanceOf()、equals()、hashCode()、isInstanceOf()和toString()。AnyVal没有更多的方法了。AnyRef则包含了Java的Object类的一些方法,比如notify()、wait()和finalize()。

AnyRef是可以直接当做java的Object来用的。对于Any和AnyVal,只有在编译的时候,scala才会将它们视为Object。换句话说,在编译阶段Any和AnyVal会被类型擦除为Object。

Nothing

一直以来,都是将scala中的概念和Java对比着来学的。确实,很多内容也都能对的上。但是Nothing这个概念却不好说了。它有点儿像java中的null——在没有明确指出的情况下,它们可以是任何类的值。但是在语义上二者有着本质的区别:Nothing是所有对象的子类,是一个类;null是所有对象的默认值,是一个特殊的独立的概念(null不是对象),是一个特殊的唯一的值。

Nothing到底是什么呢?或者换个方向考虑:Nothing的用处是什么呢?

再看一下上面的那张图,可以看到:所有类的基类都是Any,所有类的最终子类都是Nothing。换个角度来考虑:任何一个实例的类型都可以视为Any;一个Nothing的实例可以看做是任何类的实例。可是再想想,Nothing有实例么,可以将什么样的值赋给一个Nothing的实例呢。想不到可以将怎样的值赋给一个Nothing实例。Nothing看起来象是一个无用的定义。

想了好久也弄不明白Nothing的用处。姑且先记住教材上的说法吧:Nothing是一个抽象的概念,它的作用是帮助类型更平滑地进行。

-----

忽的有了一个有趣的想法:Nothing就是个鬼,当遇到无法解释或不好解释的内容,就可以堂而皇之的说“鬼晓得”。

###########

posted @ 2016-06-23 21:58  robin·张  阅读(6041)  评论(0编辑  收藏  举报