[笔记迁移][Spark开发语言][Scala][9]隐式转换与隐式参数

版权声明:Collected by Bro_Rabbit only for study https://blog.csdn.net/weixin_38240095/article/details/84135804

一、概述

  1. 其功效类似于SpringMVC中DataBind中调用的ConversionService(Converters)
  2. 最核心的任务是定义隐式转换函数(函数!!!函数!!!),即implicit conversion function
  3. 定义的隐式转换函数,只要在程序内引入,就会被Scala自动使用
    当程序中使用到隐式转换函数所接收的参数类型的对象时,Scala会自动将其传入隐式转换函数,转换为另一种类型的对象并返回
  4. 隐式转换函数叫什么名字是无所谓的,因为通常不会由用户手动调用,而是由Scala自动调用。但如果要使用隐式转换,则需要对隐式转换函数进行导入。因此通常建议将隐式转换函数命名为"xxx2yyy"的形式

二、如何进行隐式转换

  1. 要实现隐式转换,只要在程序可见范围内定义隐式转换函数即可
  2. 隐式转换函数于普通函数的唯一语法区别:以implicit开头,且必须声明函数的返回类型
    ImplicitDef

三、使用隐式转换增强现有类型(装饰模式)

DecorateImplicit

四、导入隐式转换函数的作用域

  1. Scala默认使用两种隐式转换
    (1)源类型或目标类型的伴生对象中声明的隐式转换函数
    (2) 当前程序作用域内可用唯一标识符确定的隐式转换函数

  2. 如果隐式转换函数不在上述默认位置的话,就必须手动import导入某个包下的隐式转换函数

  3. 通常建议:仅在需要进行隐式转换的地方(如函数体或方法体内)用import导入隐式转换函数以缩小隐式转换函数作用域,避免不必要的类型转换

五、隐式转换的发生时机

  1. 调用某个函数,但传入的实参类型于定义的形参类型不匹配
  2. 使用某个对象调用其类中不存在的方法
  3. 使用某个类型的对象,调用某个方法,虽然该类中存在该方法,但传入的实参类型与定义的形参类型不匹配

六、隐式参数(类DI)

  1. 隐式参数,是指在函数或方法内,定义一个用implicit修饰的参数,此时Scala会尝试找到一个指定类型的,用implicit修饰的隐式值进行注入

  2. 查找范围:
    (1) 当前作用域内可见的val或var定义的隐式变量
    (2) 隐式参数类型的伴生对象内的隐式值
    (3) 案例
    ImpicitArgs

猜你喜欢

转载自blog.csdn.net/weixin_38240095/article/details/84135804