Demo
package com.zhengkw
/**
* @ClassName:Test
* @author: zhengkw
* @description:
* @date: 20/05/12下午 11:30
* @version:1.0
* @since: jdk 1.8 scala 2.11.8
*/
object Test {
def main(args: Array[String]): Unit = {
}
}
/**
* @descrption: 特质Logger自身类型Exceptio等价于logger父类是Exception
* @date: 20/05/12 下午 11:33
* @author: zhengkw
*/
trait Logger {
this: Exception =>
def printMsg() = {
println(this.getMessage)
println(getMessage)
}
//class console extends Logger //如果要继承Logger必须console也是Exception的子类!
class console extends Exception with Logger
}
总结
自身类型是为了解决特质的循环依赖问题!
例如
class A extends B with C
B与C之间相互引用,B与C有共同父类时,这时会产生循环依赖!为了让编译器能明确知道他们的关系,所以引入了自身类型的概念!
注意事项
-
当自身引用类型显式的给定一个类型T,那么如果要混入这个特质!则被混入的类型必须先是T的子类!例如上面demo中的Logger特质!如果console要
混入Logger,则必须先成为Exception的子类! -
如果没有显式的指定类型T,那么就代表类型为这个当前的特质或者类!和this的用法一致!