隐式转换

Posted jztx123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了隐式转换相关的知识,希望对你有一定的参考价值。

隐式转换

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

  • 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
}

以上是关于隐式转换的主要内容,如果未能解决你的问题,请参考以下文章

Scala隐式转换

Scala隐式转换

将 CString 隐式转换为 char*

Java除了数字类型的自动隐式类型转换,对类有类似功能么?

Scala隐式转换

深入理解Scala的隐式转换系统