5.2 Any
类型
在Scala里,Any
类型是所有Scala类型的超类,下图用图形化的方式阐释出这一点:
在Scala里,Any
让我们可以持有任何类型对象的引用。Any
是一个抽象类,它有如下方法:!=()
、==()
、asInstanceOf()
、equals()
、hashCode()
、isInstanceOf()
和toString()
。
Any
的直接后代是AnyVal
和AnyRef
。对于所有可以映射为Java基本类型的Scala类型——比如,Int
、Double
等等,AnyVal
充当着它们的基类。另一方面,AnyRef
是所有引用类型的基类。AnyVal
没有提供任何额外的方法,AnyRef
则包含了Java的Object
方法,比如notify()
、wait()
和finalize()
。
AnyRef
直接映射为Java的Object
,在Scala里使用它,就如同在Java里使用Object
一样。另一方面,Object
也有些方法是无法通过Any
或AnyVal
的引用来调用的,即使在编译成字节码时,Scala也会在内部会把它们当作Object
的引用处理。换句话说,AnyRef
直接映射为Object
,Any
和AnyVal
则是通过类型擦除成了Object
,这点非常像Java泛型的参数化类型所做的类型擦除。