簡單的自我型別示例

可以在特徵和類中使用自我型別來定義與其混合的具體類的約束。也可以使用這種語法為 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