自身類型可以在不使用繼承情況下,使得一個類擁有另一個類的成員,如下為自身類型的定義格式
```scala
class ClassName {
// 這個表達式就是自身類型
// this關鍵字可以替換成任何非關鍵字標識符,如self、myThis都可以
// T 可以是任何類,class、abstract class、trait等都可以
this T:=>
}
```
自身類型在`class`和`trait`中的含義不同。
<br/>
**1. `trait`自身類型**
```scala
class ClassA {
def print = println("TraitA")
}
trait TraitB{
// 1. 自身類型使得TraitB擁有了ClassA的非private成員
// 2. 必須是ClassA的子類才有資格混入TraitB
this:ClassA=>
this.print // 調用ClassA的print方法
}
// ClassC是ClassA的子類所以可以混入TraitB
class ClassC extends ClassA with TraitB
// ClassD不是ClassA的子類所以不能繼承,或混入TraitB,這里編譯時報錯
class ClassD extends TraitB
```
<br/>
**2. `class`自身類型**
在類中的自身類型使得類抽象化,該類在實例化時必須混入指定的特質,這也叫動態混入特質。
```scala
trait TraitA
trait TraitB extends TraitA
trait traitC extends TraitA
trait TraitD
class ClassE {
// 自身類型使得ClassE擁有TraitA非private成員
// 當 new ClassE時必須混入TraitA或TraitA的子特質
// TraitA不能包含抽象成員
self: TraitA=>
}
object App {
def main(args:Array[String]): Unit = {
// 必須混入TraitA或它的子特質,這里編譯報錯
val classE1 = new ClassE
// 編譯通過
val classE2 = new ClassE with TraitB
// 由于TraitD不是TraitA的子特質,所以這里編譯報錯
val classE3 = new ClassE with TraitD
}
}
```
- Scala是什么?
- Scala特性
- 開發環境搭建
- 環境搭建
- windows下的環境搭建
- IntelliJ IDEA環境搭建
- Scala關鍵字
- Hello, World
- 數據類型
- 數據類型
- 數據類型層次結構
- 字面量
- Null類型
- Nothing類型
- Unit類型
- 變量與常量
- type定義類型別名
- 字符串插值器
- 條件控制
- 循環控制
- 數組
- 元組
- 集合
- 集合分類
- List常用操作
- Set常用操作
- Map常用操作
- 函數
- 函數聲明與調用
- 函數與方法的區別
- 函數注意事項
- 匿名函數
- 可變參數
- 高階函數
- 中置表達式
- 函數嵌套
- 函數科里化
- 隱式參數
- 隱式函數
- 閉包
- 類和對象
- Java與Scala的比較
- 有關類與對象概念
- 類
- 類的定義和調用
- 類的繼承
- 抽象類
- 單例對象
- 伴生對象和伴生類
- 特質
- 定義特質
- 混入特質
- 抽象類與特質的選擇
- 自身類型
- 依賴注入
- this別名
- 樣例類
- 枚舉類
- 泛型類
- 包與包對象
- 模式匹配
- 基本語法
- 匹配模式
- 偏函數
- 注解
- 運算符
- 正則表達式
- 隱式類
- 異常處理
- 高級類型
- 結構類型
- 復合類型