5.2 Any类型

在Scala里,Any类型是所有Scala类型的超类,下图用图形化的方式阐释出这一点:

5.2 Any类型 - 图1

在Scala里,Any让我们可以持有任何类型对象的引用。Any是一个抽象类,它有如下方法:!=()==()asInstanceOf()equals()hashCode()isInstanceOf()toString()

Any的直接后代是AnyValAnyRef。对于所有可以映射为Java基本类型的Scala类型——比如,IntDouble等等,AnyVal充当着它们的基类。另一方面,AnyRef是所有引用类型的基类。AnyVal没有提供任何额外的方法,AnyRef则包含了Java的Object方法,比如notify()wait()finalize()

AnyRef直接映射为Java的Object,在Scala里使用它,就如同在Java里使用Object一样。另一方面,Object也有些方法是无法通过AnyAnyVal的引用来调用的,即使在编译成字节码时,Scala也会在内部会把它们当作Object的引用处理。换句话说,AnyRef直接映射为ObjectAnyAnyVal则是通过类型擦除成了Object,这点非常像Java泛型的参数化类型所做的类型擦除。