隐式转换
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
}
以上是关于隐式转换的主要内容,如果未能解决你的问题,请参考以下文章