我们先解释一下显式转换,例如下面:
implicit def ftoInt(d: Double): Int = { d.toInt }
引出隐式转换的实际需要=>指定某些数据类型的相互转化。
隐式函数基本介绍
隐式转换函数是以implicit关键字声明的带有单个参数的函数,函数将会自动应用,将值从一种类型转换为另一种类型。、
object ImplicitDemo01 { def main(args: Array[String]): Unit = { //编写一个隐式函数转成 Double->Int 转换 //隐式函数应当在作用域才能生效 implicit def f1(d:Double): Int = { //底层 生成 f1$1 d.toInt } implicit def f2(f:Float): Int = { f.toInt } //报错:这里我们必须保证隐式函数的匹配只能是唯一的. // implicit def f3(f1:Float): Int = { // f1.toInt // } val num: Int = 3.5 // 底层编译 f1$1(3.5) val num2: Int = 4.5f // println("num:"+num.getClass+"="+ num) println("num2:"+num2.getClass+"="+ num2) } }
底层:
import scala.Predef.; import scala.collection.mutable.StringBuilder; import scala.runtime.BoxesRunTime; public final class ImplicitDemo01$ { static{ new ();} public static final MODULE$; private ImplicitDemo01$(){MODULE$ = this;} private final int f1$1(double d){ return (int)d; } private final int f2$1(float f){ return (int)f;} public void main(String[] args) { int num = f1$1(3.5D); int num2 = f2$1(4.5F); Predef..MODULE$.println(new StringBuilder().append("num =").append(BoxesRunTime.BoxToInteger(num)).toString()); } }
隐式转换的注意事项
案例提高
如果需要为一个类增加一个方法,可以通过隐式转换来实现。(动态增加功能)比如想为MysqL类增加一个delete方法
解决方案
在当前程序中,如果想要给MysqL类增加功能是非常简单的,但是在实际项目中,如果想要增加新的功能就会需要改变源代码,这是很难接受的。
而且违背了软件开发的OCP开发原则 (闭合原则 open close priceple) 。
如果需要为一个类增加一个方法,可以通过隐式转换来实现。(动态增加功能)比如想为MysqL类增加一个delete方法
object ImplicitDemo02 { def main(args: Array[String]): Unit = { // //编写一个隐式函数,丰富MysqL功能 implicit def addDelete(msql:MysqL): DB = { new DB } //创建MysqL对象 val MysqL = new MysqL MysqL.insert() MysqL.delete() // 编译器工作 分析 addDelete$1(MysqL).delete() MysqL.update() } } class MysqL { def insert(): Unit = { println("insert") } } class DB { def delete(): Unit = { println("delete") } def update(): Unit = { println("update") } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。