scala隐式类型转换和隐式参数

隐式类型转换

应用场景

  隐式类型转换常用于不同类型间数据的相互转化。
  例如,如果要将一个Double类型的数据赋值给Int类型的变量:

var number:Int = 40.3

  这样写会报错,如果需要将Double类型的数据转化为Int类型,可以使用:

40.3.toInt

  但是如果要将Double类型的数据自动转换为Int类型的数据,这时候就要用到隐式转换。

隐式转换的实现

implicit def doubleToInt(a:Double)={
      a.toInt
    }
    

  定义该方法后,在该作用域中,Double类型的数据就可以自动转换为Int类型的数据。

var number:Int = 40.3
    println(number)

注意

  1. 如果要使用隐式转换,必须和所使用的隐式转换方法在同一作用域内,必要时可以使用import来导入所要使用的隐式转换方法。
  2. 隐式转换只能在无其他可用转换的前提下才能操作。如果在同一作用域里,对同一源类型定义一个以上的隐式转换函数,如果多种隐式转换函数都可以匹配,那么编译器将报错,所以在使用时请移除不必要的隐式定义。

隐式参数

应用场景

  柯里化函数会有多个参数列表,当希望对某个参数列表采用默认参数时,可以使用implicit提供的隐式参数功能。做法是在需要自动填充的参数列表最开端加上implicit,然后在定义域内定义需要填充的默认参数值常量,并在常量的定义之前声明implicit。但是在使用隐式参数的时候,该参数必须写在柯里化函数所对应参数的最后一位,不然会报错。

隐式参数的分析及实现

隐式函数和普通柯里化函数的区别:
普通柯里化函数定义及其返回值:

def temp(a:Int)(b:Int)={
    a*b
  }
  val a1: Int => Int = temp(1)

隐式函数定义及其返回值:

def sum(a:Int)(implicit b:Int = 20): Int ={
    a*b
  }
  val result: Int = sum(2)

  普通柯里化函数在只赋一个参数的情况下,返回的是一个函数,但是隐式函数返回的是一个值。
隐式参数的作用域:
样例代码:

implicit val c = 30
  def sum(a:Int)(implicit b:Int = 20): Int ={
    a*b
  }

println(sum(2))

分析:

  1. 执行println(sum(2)(3)),运行结果为6,优先级:实参大于形参。
  2. 在不定义隐式变量c获取执行println(sum(2)())的情况下,运行样例代码,运行结果为40。
  3. 在定义隐式变量c的情况下,运行样例代码,运行结果为60。
  4. 如果在同一作用域内定义了两个相同类型的隐式变量,那么在使用隐式变量的时候会报错。例如:
implicit val c = 30
implicit val b = 40
  def sum(a:Int)(implicit b:Int = 20): Int ={
    a*b
  }

println(sum(2))

同一个作用域内不能出现两个相同类型的隐式变量,如果真的存在,使用隐式参数的类型和隐式变量的类型是否一致,如果一致,调用包含隐式参数的函数的时候,要注意!!!
优先级:
实参>上下文(作用域中)隐式变量>隐式参数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值