Cris 的 Scala 笔记整理(十):隐式转换

栏目: Scala · 发布时间: 5年前

内容简介:隐式转换函数是以首先看下面的代码如果想要转换成功,就需要借助隐式转换函数

隐式转换函数是以 implicit关键字 声明的带有 单个参数的函数 。这种函数将会 自动应用 ,将值从一种类型转换为另一种类型

① 隐式转换最佳入门案例

首先看下面的代码

Cris 的 Scala 笔记整理(十):隐式转换

如果想要转换成功,就需要借助隐式转换函数

Cris 的 Scala 笔记整理(十):隐式转换

为了更好的理解,我们看看反编译后的字节码文件,底层编译器是如何隐式转换函数的

Cris 的 Scala 笔记整理(十):隐式转换
Cris 的 Scala 笔记整理(十):隐式转换

根据需求我们可以将任意数据类型的对象转换为我们想要的数据类型,以及进行处理

implicit def func2(num: Long): Int = {
  (num - 1).toInt
}

val num2: Int = 10L
println(num2) // 9
复制代码

② 隐式转换的细节

  1. 隐式转换函数的函数名可以是任意的,隐式转换与函数名称无关,只与函数签名(函数参数类型和返回值类型)有关。

  2. 隐式函数可以有多个(即:隐式函数列表),但是需要保证在当前环境下,只有一个隐式函数能被识别

Cris 的 Scala 笔记整理(十):隐式转换

③ 强悍的隐式转换丰富类库功能

如果需要为一个类增加一个方法,可以通过隐式转换来实现。(动态增加功能)比如想为 Oracle 类增加一个 delete 方法

Cris 的 Scala 笔记整理(十):隐式转换
Cris 的 Scala 笔记整理(十):隐式转换

看看底层编译器的 魔术

Cris 的 Scala 笔记整理(十):隐式转换

细节

在当前程序中,如果想要给 Oracle 类增加功能是非常简单的,但是在实际项目中,如果想要增加新的功能就会需要改变源代码,这是很难接受的。而且违背了软件开发的 OCP 开发原则

在这种情况下,可以通过隐式转换函数给类动态添加功能

④ 隐式值

隐式值也叫 隐式变量 ,将某个形参变量标记为 implicit ,所以编译器会在方法省略隐式参数的情况下去搜索 作用域内 的隐式值作为缺省参数

示例代码

Cris 的 Scala 笔记整理(十):隐式转换

细节练习

  • 以下代码的函数命名编译器如何定义
Cris 的 Scala 笔记整理(十):隐式转换

看看底层编译器的字节码文件

Cris 的 Scala 笔记整理(十):隐式转换
  • 隐式值细节

    Cris 的 Scala 笔记整理(十):隐式转换
    Cris 的 Scala 笔记整理(十):隐式转换
    Cris 的 Scala 笔记整理(十):隐式转换
    Cris 的 Scala 笔记整理(十):隐式转换

    总结

    1. 隐式值的优先级高于默认值

    2. 当匹配到多个隐式值就会报错

⑤ 隐式类

Scala2.10 后提供了隐式类,可以使用 implicit 声明类,隐式类的非常强大,同样可以扩展类的功能,比前面使用隐式转换丰富类库功能更加的方便,在集合中隐式类会发挥重要的作用

示例代码

object Main {
  def main(args: Array[String]): Unit = {

    // 隐式类会独立生成一个 .class 文件,还会在当前 Main 类生成一个转换函数
    implicit class Driver(oracle: Oracle) {
      def add(): Unit = {
        println("Driver add")
      }
    }
    val oracle = new Oracle
    // 实质上是调用了转换函数生成一个隐式类对象来调用 add 方法
    oracle.add() // Driver add
    oracle.func() // Oracle func
  }
}

class Oracle {
  def func(): Unit = {
    println("Oracle func")
  }
}
复制代码
Cris 的 Scala 笔记整理(十):隐式转换
Cris 的 Scala 笔记整理(十):隐式转换

隐式类的特点

  1. 其所带的构造参数有且只能有一个

  2. 隐式类必须被定义在 伴生对象包对象 里,即隐式类不能是 顶级的 ( top-level objects )

  3. 隐式类不能是 case class (类型匹配)

  4. 作用域内不能有与之相同名称的标示符


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

ACM图灵奖演讲集

ACM图灵奖演讲集

阿申豪斯特 / 苏运霖 / 电子工业出版社 / 2005-4 / 55.0

本书完整地收录了这些演讲,并配之以部分获奖者撰写的后记,旨在反映过去数年来这一领域中发生的变化。对任何一位计算机科学的历史与发展有兴趣的人来说,本书都极具收藏价值。  本文收录了自图灵奖开始颁发的1966年起到1985年这20年间图灵奖获得者在授奖大会上所做演讲的全文。由于在此期间有三次是把奖项同时授予两个人的,而其中有两次两位获奖者分别做了演讲,因此一共收录了22篇演讲稿。本书把这些演讲分为两大......一起来看看 《ACM图灵奖演讲集》 这本书的介绍吧!

html转js在线工具
html转js在线工具

html转js在线工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具