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

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

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

隐式转换函数是以 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. 作用域内不能有与之相同名称的标示符


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

查看所有标签

猜你喜欢:

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

游戏编程入门

游戏编程入门

莫里森 / 人民邮电出版社 / 2005-9 / 49.00元

本书介绍如何设计和构建自己的计算机游戏。书中从零开始,引导读者开发一个“即插即用”的游戏引擎,并基于该引擎,循序渐进地开发7个完整的游戏。全书分为8个部分,共24章,内容包括游戏编程基础知识、如何与玩家交互、使用子画面动画、使用声音和音乐、高级动画、游戏人工智能、增添游戏的趣味性和附加练习。此外,在随书光盘中提供有附录,包括C++语言和windows编程的入门指导、游戏开发工具以及游戏图形创建的介......一起来看看 《游戏编程入门》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具