标签:存在 动态 不能 tor alc asp 定义 aspect unit
为已经存在的类增加方法。
// 普通人
class Man(val name:String){
def eat(): Unit ={
println(s"man [$name] eat...")
}
}
// 超人
class SuperMan(val name:String){
def fly(): Unit ={
println(s"superman[$name] fly...")
}
}
val man = new Man("zs") // 实例化一个叫“张三”的普通人
man.eat() // 发现张三只能吃饭,不能飞。。。
// 使用隐式转换,相当于Java中的动态代理
// 定义隐式转换函数:给Man增加fly方法
/*
格式 :
implicit def 方法名(接收一个普通人) = new 超人类(普通人的名字)
结果:
还你一个超人!
*/
implicit def man2superman(man:Man)= new SuperMan(man.name) // 增加这行代码
val man = new Man("zs") // 实例化一个叫“张三”的普通人
man.eat() // 张三可以吃饭
man.fly() // 发现多了一个fly方法,说明张三可以飞了
// 注释掉以下这行代码,张三就变回普通人le
// implicit def man2superman(man:Man)= new SuperMan(man.name)
object ImplicitAspect {
// 可以在这里封装所有隐式转换
implicit def man2superman(man:Man)= new SuperMan(man.name)
}
// 具体包名自定义
import test.ImplicitAspect._
// 直接使用就可以了
val man = new Man("zs")
man.fly()
带implicit参数的方法在调用时会自动寻找:implicit实际变量进行传参调用!
object testApp extends App {
def testParam(implicit name: String): Unit = {
println(name + "----------")
}
// 使用implicit修饰的变量
implicit val name = "zs"
// 自动寻找implicit变量并传参
testParam // zs----------
}
了解即可,不建议使用!实际开发中,会把人绕晕。
对类使用implicit限定,就是对类进行功能的增强。
object ImplicitClassApp extends App {
// 不能使用在外面
implicit class Calculator(x:Int){
def addnumbers(y:Int)= x+y
}
// 新增了一个本来没有的addnumbers方法
// 现在所有的Int类型都拥有addnumbers方法!
println(2.addnumbers(3)) // 5
}
标签:存在 动态 不能 tor alc asp 定义 aspect unit
原文地址:https://www.cnblogs.com/JZTX123/p/10624899.html