|NO.Z.00070|——————————|BigDataEnd|——|Hadoop&Scala.V02|——|Scala.v02|隐式机制|隐式转换函数.v01|
一、隐式转换函数
### --- 隐式转换函数
~~~ Scala的隐式转换最核心的就是定义隐式转换函数,即implicit conversion function。
~~~ 定义的隐式转换函数,只要在编写的程序内引入,就会被Scala自动使用。
~~~ 隐式转换函数由Scala自动调用,通常建议将隐式转换函数的名称命名为“one2one”的形式。
### --- 编程示例
~~~ # 示例1:下面代码中定义了一个隐式函数
class Num {}
class RichNum(num: Num) {
def rich(): Unit = {
println("Hello Implicit!")
}
}
object ImplicitDemo {
// 定义一个名称为num2RichNum的隐式函数
implicit def num2RichNum(num: Num): RichNum = {
new RichNum(num)
}
def main(args: Array[String]): Unit = {
val num = new Num
// num对象并没有rich方法,编译器会查找当前范围内是否有可转换的函数
// 如果没有则编译失败,如果有则会调用。
num.rich()
}
}
~~~ # 示例2:导入隐式函数
package test.implicitdemo
object Int2String {
implicit def int2String(num: Int):String = num.toString
}
### --- string类型的length方法
~~~ 下面代码中调用了String类型的length方法,Int类型本身没有length方法,
~~~ 但是在可用范围内定义了可以把Int转换为String的隐式函数int2String,
~~~ 因此函数编译通过并运行出正确的结果。
~~~ 此示例中隐式函数的定义必须定义在使用之前,否则编译报错。
import test.implicitdemo.Int2String._
object ImplicitTest {
def main(args: Array[String]): Unit = {
println(20.length)
}
}
~~~ # 通过import test.implicitdemo.Int2String._,
~~~ 将Int2StringTest内部的成员导入到相应的作用域内,否则无法调用隐式函数。
~~~ 要实现隐式转换,只要在程序可见的范围内定义隐式转换函数即可,Scala会自动使用隐式转换函数。
~~~ 隐式转换函数与普通函数的语法区别就是,要以implicit开头,而且最好要定义函数返回类型。
二、编程实现
### --- 编程代码
package yanqi.cn.part10
class Num{}
class RichNum(num:Num){
def rich(): Unit ={
println("hello implicit!")
}
}
object ImplicitDemo {
//定义一个隐式转换函数,命名要符合one2one的格式
implicit def num2RichNum(num:Num):RichNum={
new RichNum(num)
}
def main(args: Array[String]): Unit = {
val num=new Num
//num类型的对象没有rich方法,但是Scala编译器会查找当前范围内是否有隐式转换函数,
//然后将其转换成RichNum类型,这样就可以访问rich方法了
num.rich()
}
}
### --- 编译打印
D:\JAVA\jdk1.8.0_231\bin\java.exe "-javaagent:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=61227:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath D:\JAVA\jdk1.8.0_231\jre\lib\charsets.jar;D:\JAVA\jdk1.8.0_231\jre\lib\deploy.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\access-bridge-64.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\cldrdata.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\dnsns.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\jaccess.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\jfxrt.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\localedata.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\nashorn.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\sunec.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\sunjce_provider.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\sunmscapi.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\sunpkcs11.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\zipfs.jar;D:\JAVA\jdk1.8.0_231\jre\lib\javaws.jar;D:\JAVA\jdk1.8.0_231\jre\lib\jce.jar;D:\JAVA\jdk1.8.0_231\jre\lib\jfr.jar;D:\JAVA\jdk1.8.0_231\jre\lib\jfxswt.jar;D:\JAVA\jdk1.8.0_231\jre\lib\jsse.jar;D:\JAVA\jdk1.8.0_231\jre\lib\management-agent.jar;D:\JAVA\jdk1.8.0_231\jre\lib\plugin.jar;D:\JAVA\jdk1.8.0_231\jre\lib\resources.jar;D:\JAVA\jdk1.8.0_231\jre\lib\rt.jar;E:\NO.Z.10000——javaproject\NO.Z.00002.Hadoop\ScalaPro\out\production\ScalaPro;D:\JAVA\scala-2.12.2\lib\scala-library.jar;D:\JAVA\scala-2.12.2\lib\scala-reflect.jar yanqi.cn.part10.ImplicitDemo
hello implicit!
Process finished with exit code 0
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
分类:
bdv015-scala
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」