Scala对象系统与类型变异性深度解析
1. 面向对象设计原则与回顾
在良好的面向对象设计中,一个通用原则是实例从构造过程完成的那一刻起,就应始终处于已知的有效状态。此前我们学习了如何使用特质(traits)来封装和共享类之间的横切关注点,涵盖了特质的使用时机、方法,多个特质的“堆叠”方式,以及特质内值的初始化规则。接下来,将深入探索Scala的对象系统和类层次结构,尤其关注集合相关内容。
2. 继承下的类型变异性
Java和Scala的参数化类型(Java中通常称为泛型)在继承下的变异性表现存在重要差异。例如,若一个方法接受 List[AnyRef] 类型的参数,能否传入 List[String] 值呢?若 List[String] 被视为 List[AnyRef] 的子类型,这种变异性称为协变性(covariance),因为容器(参数化类型)的父子类型关系与类型参数的关系“同向”。
此外,还存在逆变类型(contravariant),对于某些类型 X , X[String] 可能是 X[Any] 的超类型。若参数化类型既非协变也非逆变,则称为不变类型(invariant),部分参数化类型还可能兼具多种变异性。
Scala和Java都支持协变、逆变和不变类型。在Scala中,变异性行为是类型声明的一部分,通过在每个类型参数上使用所谓的变异性注解来定义。协变类型参数使用 + ,逆变类型参数使用
超级会员免费看
订阅专栏 解锁全文
812

被折叠的 条评论
为什么被折叠?



