通用特质(universal traits)

我不确定通用特质(universal traits)这个术语是不是因为值类型(value classes)在混入特质时需要特别的限制才发明的,还是以前就有这种定义只是在值类型中被用到而已。它指的是那些继承自Any的trait,并且内部成员只有def定义的方法,且没有初始化语句。

举例来看:

// 不是通用特质,没有继承Any
trait A { def foo() = 2 }

// 是通用特质
trait B extends Any { def foo() = 2 }

// 如果有初始化语句,会报错
scala> trait C extends Any { println("hi"); def foo() = 2 }
<console>:7: error: this statement is not allowed in universal trait extending from class Any
   trait C extends Any { println("hi"); def foo() = 2 }
                                ^

值类型要继承通用特质时,不能省略extends AnyVal,继承的是AnyVal混入了通用特质的类型。

class MyVal(val s:String) extends AnyVal with B 

通用特质中的方法也可以是抽象的,值类型在继承时可以override通用特质中的方法

scala> trait X extends Any { def foo() }

scala> class MyVal(val s:String) extends AnyVal with X { override def foo() = 2 }

通用特质也可以有继承关系,通用特质只能继承自通用特质

// 继承自非通用特质会报错
scala> trait NotUniversal { def foo() = 2 }

scala> trait X extends Any with NotUniversal
<console>:8: error: illegal inheritance; superclass Any
 is not a subclass of the superclass Object of the mixin trait NotUniversal
       trait X extends Any with NotUniversal
                                ^

scala> trait Universal extends Any { def foo = 2 }

// OK
scala> trait X extends Any with Universal

注意在继承通用特质时,extends Any中的Any省略的话,将不被当作通用特质

// 特质X不再被当作通用特质
scala> trait X extends Universal 

// 不能省略Any 
scala> trait X extends Any with Universal

通用特质(universal traits)》上有1条评论

  1. hary

    通用特质在什么情况下使用? 为什么要引入这个概念?

    回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注