Scala 隐式转换

什么是隐式转换

我理解的隐式转换是一种能像装饰器设计模式一样,对原有功能进行增强的语法。

当原有函数不具备某些我们想要的功能时,我们或许可以通过隐式转换来解决这样的问题。

比如我们想得到一杯果汁,却只有一个苹果的时候

  • 装饰器设计模式

    用一个榨汁机把苹果榨成果汁给用户。

  • 隐式转换

    将苹果转换成果汁给用户。

  • 例一

    import java.io.{File}
    import scala.io.Source
    
    object Test01 {
    
        implicit class RichFile(from:File){
            def readAll: String = Source.fromFile(from.getPath).mkString
        }
    
        def main(args: Array[String]): Unit = {
            val file = new File("d://in/imp.txt")
            println(file.readAll)//file变成了RichFile
        }
    }
    

    上面的例子对原本java的File类新增了一个readAll的方法,做到了功能的增强。

    隐式转换做的事:将java的File类转换成了RichFIle类。

  • 例二

    import java.io.File
    import scala.io.Source
    
    object Test01 {
    
        implicit def file2Array(file: File):Array[String] = {
            Source.fromFile(file.getPath).mkString.split("\n")
        }
    
        def printAll(source: Array[String]) = {
        	source.map(x=> println(x))
     	}
    
        def main(args: Array[String]): Unit = {
            printAll(new File("d://in/imp.txt"))
        }
    }
    

    上面的例子,明明printAll需要的是一个Array[String],但是传进去的却是一个File,却同样能得到想要的结果(打印文本的内容)

    隐式转换做的事:将java的File类转换成了Array[String]类。

Scala中的隐式转换是一种非常强大的代码查找机制。当函数、构造器调用缺少参数或者某一实例调用了其他类型的方法导致编译不通过时,编译器会尝试搜索一些特定的区域,尝试使编译通过。

隐式操作规则(https://www.jianshu.com/p/a344914de895)

  1. 标记规则:只有标记为implicit的变量,函数或对象定义才能被编译器当做隐式操作目标。
  2. 作用域规则:插入的隐式转换必须是单一标示符的形式处于作用域中,或与源/目标类型关联在一起。单一标示符是说当隐式转换作用时应该是这样的形式:file2Array(arg).map(fn)的形式,而不是foo.file2Array(arg).map的形式。假设file2Array函数定义在foo对象中,我们应该通过import foo._或者import foo.file2Array把隐式转换导入。简单来说,隐式代码应该可以被"直接"使用,不能再依赖类路径。
    假如我们把隐式转换定义在源类型或者目标类型的伴生对象内,则我们可以跳过单一标示符的规则。因为编译器在编译期间会自动搜索源类型和目标类型的伴生对象,以尝试找到合适的隐式转换。
  3. 无歧义规则:不能存在多于一个隐式转换使某段代码编译通过。因为这种情况下会产生迷惑,编译器不能确定到底使用哪个隐式转换。
  4. 单一调用规则:不会叠加(重复嵌套)使用隐式转换。一次隐式转化调用成功之后,编译器不会再去寻找其他的隐式转换。
  5. 显示操作优先规则:当前代码类型检查没有问题,编译器不会尝试查找隐式转换。
Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值