Scala13_隐式转换

隐式转换

隐式转换的含义:
在之前的类型学习中,我们已经学习了自动类型转换,精度小的类型可以自动转换为精度大的类型,这个转换过程无需开发人员参与,由编译器自动完成,这个转换操作我们称之为隐式转换。

在其他的场合,隐式转换也起到了非常重要的作用。如Scala在程序编译错误时,可以通过隐式转换中类型转换机制尝试进行二次编译,将本身错误无法编译通过的代码通过类型转换后编译通过。慢慢地,这也形成了一种扩展功能的转换机制。

1. 隐式函数

在这里插入图片描述

编译器在编译的时候可能编译不通过,此时会尝试在作用于范围内查找可以让程序编译通过的逻辑,然后使用这段逻辑进行二次编译,让编译通过;
需要对指定的逻辑加上标记,告诉编译器这个标记的函数可以进行二次编译
在这里插入图片描述

(1)相同作用于下,相同的隐式转换规则不可以出现多次
(2)隐式转换不是第一次编译发生的,而是第一次编译不通过,通过第二次编译而产生的,所以不会对原本正确的代码产生影响!
(3)隐式转换是除了特质以外,也可以扩展功能

2.隐式参数&隐式变量

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

    //隐式参数
    def reg(implicit password : String = "000000") : Unit = {
      println("密码为:"+password)
    }

    //隐式变量   注意和隐式参数类型一致
    implicit val password : String = "123123"

    //如果应用隐式参数,小括号可以省略
    reg  //密码为:123123
    //没有省略,不传值,隐式参数不起作用
    reg() //密码为:000000
    //传递参数,那么传递的就是最终参数
    reg("456456") //密码为:456456
  }
}
  • 隐式参数:就是让编译器帮我们传参

  • 隐式变量:和隐式参数对应出现,是备份的作用;通过不同的书写方式,决定是否让编译器帮我们将隐式变量传递给隐式参数;
    (1)如果调用方法的时候,只写方法名,就是将隐式变量传递给隐式参数
    (2)如果调用方法的时候,写方法名+小括号,但是不传入参数,就是不将隐式变量传递给隐式参数
    (3)如果调用方法的时候,自己写实参,就是将实参传递给隐式参数

  • 相同作用域下,隐式变量只能有一个(转换规则唯一性),否则隐式参数不知道该传入哪个变量
    在这里插入图片描述


需要注意的是在List的sortBy中就应用到了隐式参数和隐式变量
在这里插入图片描述
1.sortBy这是函数柯里化,所以可以传递多个参数列表,但是问题在于即便是柯里化,定义好了函数之后,所有参数列表都必须要写上,否则报错,如下图所示:
在这里插入图片描述
2.本质原因在于sortBy第二个参数列表中的参数是隐式参数
在这里插入图片描述
隐式参数可以省略,让编译器帮我们传递;

3.隐式类

在Scala2.10后提供了隐式类,可以使用implicit声明类,隐式类非常强大,同样可以扩展类的功能,在集合的数据处理中,隐式类发挥了重要的作用。

  • 隐式类所带的构造参数有且只能有一个
object ScalaImplicit {
    def main(args: Array[String]): Unit = {
        val emp = new Emp()
        emp.insertUser()
    }
    class Emp {
    }
    //当前 ScalaImplicit类中使用了此隐式类,因此可以使用
    implicit class User( emp : Emp) {
        def insertUser(): Unit = {
            println("insert user...")
        }
    }
}

隐式类的定义环境

  • 隐式类可以被定义在当前使用此类的**“类**”中
  • 隐式类可以被定义在当前使用此类的**“类”的父类**中
  • 隐式类可以被定义在当前使用此类的**“类”的父类的伴生对象**中
  • 隐式类可以被定义在当前使用此类的**“类”混入的特质或者特质的伴生对象**中
  • 隐式类可以被定义在包对象中
  • 可以通过导入隐式类来使用
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值