自身类型可以在不使用继承情况下,使得一个类拥有另一个类的成员,如下为自身类型的定义格式
```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别名
- 样例类
- 枚举类
- 泛型类
- 包与包对象
- 模式匹配
- 基本语法
- 匹配模式
- 偏函数
- 注解
- 运算符
- 正则表达式
- 隐式类
- 异常处理
- 高级类型
- 结构类型
- 复合类型