scala学习手记18 - Any和Nothing
2016-06-23 21:58
393 查看
Any
前面已经有两次提到过:在scala中,Any类是所有类的超类。Any有两个子类:AnyVal和AnyRef。对应Java直接类型的scala封装类,如Int、Double等,AnyVal是它们的基类;对应引用类型,AnyRef是它们的基类。
scala中,所有类的关系可以用下面这张图大致描述下:
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就是个鬼,当遇到无法解释或不好解释的内容,就可以堂而皇之的说“鬼晓得”。
###########
相关文章推荐
- item31,连续子数组的最大和
- Android Https相关完全解析 当OkHttp遇到Https
- 使用memcached实现tomcat集群中Session共享业务场景
- markdown 学习笔记
- JDBC提示错误
- Java数组类型转换
- 如何将Unity中的脚本文件转为dll文件
- github项目解析(七)-->防止按钮重复点击
- 关于最近使用imageMagick的Jmagick和im4java
- LeetCode第47.题之Permutations II
- “再按一次返回键退出程序”实现
- 个人总结
- 【设计模式】传输对象模式
- BZOJ1088: [SCOI2005]扫雷Mine
- 答疑java集合问题
- 编程之美-看看出了什么问题?
- 用“辗转相除法”求最大公约数
- 盲打首秀
- Android Handler 异步消息处理机制的妙用 创建强大的图片加载类
- Docker学习笔记-数据卷、数据卷容器