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. 作用域内不能有与之相同名称的标示符


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

查看所有标签

猜你喜欢:

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

Head First HTML and CSS

Head First HTML and CSS

Elisabeth Robson、Eric Freeman / O'Reilly Media / 2012-9-8 / USD 39.99

Tired of reading HTML books that only make sense after you're an expert? Then it's about time you picked up Head First HTML and really learned HTML. You want to learn HTML so you can finally create th......一起来看看 《Head First HTML and CSS》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具