根类
图12展示了Scala类的层次结构。层次结构的根是类Any。Scala执行环境中的每个类都直接或间接地继承自该类。类Any有两个直接子类:AnyRef和AnyVal。
子类AnyRef表示在宿主系统中表示为一个对象的所有值。所有用户定义的Scala类都直接或间接的继承自该类。更进一步,所有用户定义的Scala类也都继承自特征scala.ScalaObject。由其他语言编写的类也都继承自scala.AnyRef,但是并没有继承scala.ScalaObject。
图12.1 Scala类层次结构
类AnyVal有固定数目的子类,它们描述了在宿主系统中没有作为对象来实现的那些值。
类AnyRef和AnyVal只需要提供在类Any中声明的成员,但是具体实现可以添加宿主有关的方法到这些类中(例如,一个实现可以有其自有的对象的根类)。
这些根类的签名描述如下。
package scala
/** 通用根类 */
abstract class Any {
/** 定义相等,在这里是抽象的 */
def equals(that: Any): Boolean
/** 值间的语义相等 */
final def == (that: Any): Boolean =
if (null eq this) null eq that else this equals that
/** 值间的语义不等 */
final def != (that: Any): Boolean = !(this == that)
/** Hash code, 这里是抽象的 */
def hashCode: Int = ...
/** 文本表示,这里是抽象的 */
def toString: String = ...
/** 类型测试,需要按照下面的方式内联化 */
def isInstanceOf[a]: Boolean = this match {
case x: a => true
case _ => false
}
/** 类型转换,需要按照下面的方式内联化 */
def asInstanceOf[A] = this match {
case x: A => x
case _ => if (this eq null) this
else throw new ClassCastException()
}
}
/** 所有值类型的根类 */
final class AnyVal extends Any
/** 所有引用类型的根类 */
class AnyRef extends Any {
def equals(that: Any): Boolean = this eq that
final def eq(that: AnyRef): Boolean = ... //引用相等
final def ne(that: AnyRef): Boolean = !(this eq that)
Scala 标准库
103
def hashCode: Int = ... //由内存地址计算得来
def toString: String = ... //由hashcode和类名得来
}
/** 应用于用户定义的scala类的混入类 */
trait ScalaObject extends AnyRef
对于测试x.asInstanceOf[T],如果T是一个数字值类,则做特殊处理。在此情况下的转换是应用一个转换方法x.to。对于不是数值的值x该操作将导致ClassCastException。
|