自类型是声明一个特征必须继承另一个特征,甚至没有直接继承它的一种方式。这使得依赖成员在没有导入时就可以使用。
自类型就是一种缩小 this
类型或 this
别名的类型。语法看起来像普通函数的语法但是意思完全不同。
在特征中使用自类型,定义一个标识符,是另一个类型的特征和一个 =>
。(例如: someIdentifier: SomeOtherTrait =>
)。
trait User {
` def username: String
}
trait Tweeter {
this: User => // 重新赋值 this
def tweet(tweetText: String) = println(s"$username: $tweetText")
}
class VerifiedTweeter(val username_: String) extends Tweeter with User { // 我们混入 User 特征,因为 Tweeter 特征需要它
def username = s"real $username_"
}
val realBeyoncé = new VerifiedTweeter("Beyoncé")
realBeyoncé.tweet("Just spilled my glass of lemonade") // 会输出 “real Beyoncé: Just spilled my glass of lemonade”
因为 this: User =>
自类型在 trait Tweeter
中,所以变量 username
就可以在 tweet
方法中使用。同时也意味着 VerifiedTweeter
类继承 Tweeter
特征时,必须混入 User
特征(使用 with User
)。