4 August 2022
Scala线性化算法
layout: post title: “scala 类的线性化算法” date: 2022-08-04 08:25:10 +0800 categories: note tags: scala —
类的线性化
class Q{print("->Q")}
trait W extends Q{print("->W")}
trait E extends W{print("->E")}
trait Z extends Q{print("->Z")}
new Q with Z with E with W
// 线性化从先是自身然后将继承混入的类由远及近的线性化
// 重复的类选择最右边出现的(只会构造一次)
// 线性化顺序就是构造顺序的倒序
// L(Q)=Q<<L(W)<<L(E)<<L(Z)
// L(Q)=Q<<L(W<<Q)<<L(E<<Q<<W)<<L(Z<<Q)
// 线性化结果 :E<W<Z<Q
// 也可以理解为 类的初始化从自身开始初始化,然后从rightmost 开始压栈,重复的类已经定义过就不需要再压栈了
trait H { print("->H")}
trait S extends H {print("->S")}
trait R {print("->R")}
trait T extends R with H {print("->T")}
class B extends A with T with S {print("->B")}
// L(B)=B>>L(S)>L(T)>L(A)
// L(B)=B>>L(S>>H)>>L(T>>H>>R)>>L(A>>X)
//L(B)=B,S,T,H,R,A,X
new B
scala structual Type
``` type javaClosae=java.util.Closeable
trait mineCloseAble{ def close():Unit }
type CanClose={ def close():Unit }
object Test{ // 可以接受各种类型的close def closeScilent(c:CanClose):c.close def main(args:String*)={
} }