Scala中的Any、Nothing、Null、Nil
Scala中的Any、Nothing、Null、NilAny在scala中,Any类是所有类的超类。Any有两个子类:AnyVal和AnyRef。 对于直接类型的scala封装类,如Int、Double等,AnyVal是它们的基类;对于引用类型,AnyRef是它们的基类。 Any是一个抽象类,它有如下方法:!=()、==()、asInstanceOf()、equals()、hashCode()、isInstanceOf()和toString()。 AnyVal没有更多的方法了。AnyRef则包含了Java的Object类的一些方法,比如notify()、wait()和finalize()。 AnyRef是可以直接当做java的Object来用的。对于Any和AnyVal,只有在编译的时候,scala编译器才会将它们视为Object。换句话说,在编译阶段Any和AnyVal会被类型擦除为Object。 Nothing如上图所示,Nothing是所有类的子类,是一个类。Nothing没有对象,但是可以用来定义类型。 在Java当中你很难找到类似的东西对应Scala中的Nothing。Nothing到底是什么呢?或者换个方向考虑:Nothing的用处是什么呢?
scala> def foo = throw new RuntimeException
foo: Nothing
scala> val l:List[Int] = List[Nothing]()
l: List[Int] = List()
因为 NullNull是所有AnyRef的子类,是所有继承了Object的类的子类,所以Null可以赋值给所有的引用类型(AnyRef),不能赋值给值类型(AnyVal),这个java的语义是相同的。null是Null的唯一对象。 val x = null // x: Null
val y: String = null // y: String = null
val z: Int = null // error: type mismatch
val u: Unit = null // u: Unit = ()
注意,不要被Unit值类型在赋值时的障眼法给骗了,以为null可以被赋给Unit。实际上把任何表达式结果不是Unit类型的表达式赋给Unit类型变量,都被转为 Null在类型推导时只能被造型为AnyRef分支下的类型,不能造型为AnyVal分支下的类型,不过我们显式的通过asInstanceOf操作却又是可以把null造型为AnyVal类型的: val i = null.asInstanceOf[Int]
// 类似于java里的 int i = (int)((Integer)null);
先装箱 // java里,编译通过,运行失败,空指针异常
int i = (int)((Integer)null);
// scala里,把值为null的Integer拆箱为值类型Int是ok的,得到Int的默认值0
val i = null.asInstanceOf[java.lang.Integer].asInstanceOf[Int]
在java里基本类型(primitive type) 与引用类型是有明确差异的,虽然提供了自动装箱拆箱的便捷,但在类型上两者是不统一的;而scala里修正这一点, NilNil是一个空的List,定义为 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |