简单的自我类型示例

可以在特征和类中使用自我类型来定义与其混合的具体类的约束。也可以使用这种语法为 this 使用不同的标识符(当外部对象必须从内部对象引用时很有用)。

假设你要存储一些对象。为此,你可以为存储创建接口并向容器添加值:

 trait Container[+T] {
   def add(o: T): Unit
 }

 trait PermanentStorage[T] {
   /* Constraint on self type: it should be Container
    * we can refer to that type as `identifier`, usually `this` or `self`
    * or the type's name is used. */
   identifier: Container[T] =>

   def save(o: T): Unit = {
     identifier.add(o)
     //Do something to persist too.
   }
 }

这种方式不在同一对象层次结构中,但如果没有实现 Container,则无法实现 PermanentStorage