码迷,mamicode.com
首页 > 其他好文 > 详细

隐式转换

时间:2019-03-30 01:25:50      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:存在   动态   不能   tor   alc   asp   定义   aspect   unit   

隐式转换

为已经存在的类增加方法。

  • Java:动态代理
  • scala:隐式转换

案例:普通人变超人

  • 先定义两个类
// 普通人
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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!