Scala-隐式转换

       当编译器第一次编译失败的时候,会在当前的环境中查找能让代码编译通过的方法,用 于将类型进行转换,实现二次编译

隐式函数 

  • 隐式转换可以在不需改任何代码的情况下,扩展某个类的功能。 
  • 使用 implicit 关键字声明的函数称之为隐式函数
class MyRichInt(val self: Int) {
  def myMax(i: Int): Int = {
    if (self < i) i else self
  }
  def myMin(i: Int): Int = {
    if (self < i) self else i
  }
}
object TestImplicitFunction {
  implicit def convert(arg: Int): MyRichInt = {
  new MyRichInt(arg)
}
  def main(args: Array[String]): Unit = {
    // 当想调用对象功能时,如果编译错误,那么编译器会尝试在当前作用域范围内查找能调用对应功能的转换规则,这个调用过程是由编译器完成的,所以称之为隐式转换。也称之为自动转换
    println(2.myMax(6))
  }
}

 

 隐式参数

      普通方法或者函数中的参数可以通过 implicit 关键字声明为隐式参数,调用该方法时, 就可以传入该参数,编译器会在相应的作用域寻找符合条件的隐式值。

  1. 同一个作用域中,相同类型的隐式值只能有一个
  2. 编译器按照隐式参数的类型去寻找对应类型的隐式值,与隐式值的名称无关。
  3. 隐式参数优先于默认参数
object TestImplicitParameter {
 implicit val str: String = "hello world!"
 def hello(implicit arg: String="good bey world!"): Unit = {
 println(arg)
 }
 def main(args: Array[String]): Unit = {
 hello
 }
}

隐式类 

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

  • 其所带的构造参数有且只能有一个
  • 隐式类必须被定义在“类”或“伴生对象”或“包对象”里,即隐式类不能是顶 级的。 
object TestImplicitClass {
 implicit class MyRichInt(arg: Int) {
 def myMax(i: Int): Int = {
 if (arg < i) i else arg
 }
 def myMin(i: Int) = {
 if (arg < i) arg else i
 }
 }
 def main(args: Array[String]): Unit = {
 println(1.myMax(3))
 }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

open_test01

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

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

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

打赏作者

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

抵扣说明:

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

余额充值