Scala隐式转换

隐式转换函数:

object ListDemo{
  implicit def int2String(value:Int) = value.toString
  def main(args: Array[String]): Unit = {
    println( 10.length)
  }
}

上面的代码能够正常的执行,并且会输出2. 原因是以为多了一个用implicit修饰的函数,叫做隐式函数。他与正常函数的区别是前面加了一个implicit,他的意义在与如果编译器在编译的时候找不到你所用的类型,那么隐式转换函数会自动将数据转换成你所期望的类型。所以上面的10调用length不合法,但是会自动在当前作用域中寻找隐式函数使其合法。

隐式转换函数的发生在下面的情形:
e是一个S类型的表达式,而需要的却是T类型,编译器会寻找S=>T的隐式转换
e是一个S类型的表达式,使用点号访问e.m时,m不是类型S的成员,编译器会寻找合适的隐式转换使e.m合法

再比如:

class ListDemo(value:Int) {
  def sayInt(value1:Int): Unit ={
    println(value + value1)
  }
}

object ListDemo{
  implicit def int2Val(value:Int) = new ListDemo(value)
  def main(args: Array[String]): Unit = {
    2.sayInt(3)
  }
}

编译器会根据隐式转换函数把2转换成ListDemo对象,然后调用sayInt方法进行相加

隐式转换函数目的是由一种参数转为另一种参数,所以隐式转换函数的只能有一个参数

隐式类: 类的前面加implicit,隐式类用来增加类的功能
上面第二个例子中我们可以直接用隐式类来进行转换,看起来更简单,比如:

object ListDemo{
  implicit class Demo(value:Int){
    def sayInt(value1:Int): Unit ={
      println(value + value1)
    }
  }
  
  def main(args: Array[String]): Unit = {
    2.sayInt(3)
  }
}

隐式类的定义也是有限制的,比如说构造函数中必须携带一个参数,只能在别的trait/类/对象内部定义等。

隐式参数:
方法可以具有 隐式 参数列表,由参数列表开头的 implicit 关键字标记。 如果参数列表中的参数没有像往常一样传递, Scala 将查看它是否可以获得正确类型的隐式值,如果可以,则自动传递。
比如说:

class ListDemo {
  def sayInt(implicit value1:Int): Unit ={
    println(value1)
  }
}

object ListDemo{
  implicit var value:Int = 10
  def main(args: Array[String]): Unit = {
    new ListDemo().sayInt
  }
}

上面的sayInt没有传递任何值也不会报错,是因为它自动找到了value:Int = 10,并将其专递 了过去。

隐式转换虽然灵活,但是无疑加大了代码的可读性。
只是学了学 还需多多联系

欢迎关注我的公众号:北风中独行的蜗牛(manong_xiaodong)
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟红尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值