Scala隐式转换

说明

        当编译器第一次编译失败的时候,会在当前作用域中寻找能让diamagnetic编译通过的方法,用于将类型进行转换,实现二次编译。

        隐式转换可以在不修改任何代码的基础上,对类的功能进行扩展。

        当调用对象的某个功能时,如果编译错误,那么编译器会尝试在当前作用域中查找能调用该功能的转换规则,这个调用过程是编译器自动完成的,所以叫隐式转换,也叫自动转换。

隐式函数

object Scala01_Implicit {
  // implicit 关键字声明隐式函数
  implicit def convert(i: Int): MyInt = {
    new MyInt(i)
  }

  def main(args: Array[String]): Unit = {
    // 当调用对象的方法,如果编译错误,那么编译器会在当前作用域中寻找能调用该方法的转换规则,
    // 因为调用过程是编译器完成的,所以称之为隐式转换,也叫自动转换。
    println(1.myMax(10))
    println(1.myMin(10))
  }
}

class MyInt(val self: Int) {
  def myMax(i: Int) = {
    if (i > self) i else self
  }

  def myMin(i: Int) = {
    if (i < self) i else self
  }
}

隐式参数

  • 一个作用域中,同类型的隐式参数只能有一个。
  • 编译器会根据隐式参数的类型去寻找对应的隐式参数值,和参数名称无关。
  • 隐士参数优先于默认参数。
implicit val word: String = "hello spark"

def hello(implicit w: String = "hello scala"): Unit ={
  println(w)
}

def main(args: Array[String]): Unit = {
  hello		// hello spark
}

隐式类

  • 隐式类的参数有且只能有一个。
  • 隐式类只能定义在类中、伴生对象中、包对象中,即隐式类不能是顶级类。
object Scala03_Implicit {
  // 定义隐式类
  implicit class MyInt03(self: Int) {
    def myMax(i: Int) = {
      if (self > i) self else i
    }

    def myMin(i: Int) = {
      if (self < i) self else i
    }
  }

  def main(args: Array[String]): Unit = {
    println(1.myMax(10))
    println(1.myMin(10))
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值