【图文详细 】Scala——隐式转换和隐式参数

本文详细介绍了Scala中的隐式转换和隐式参数,如何利用它们增强类库功能并隐藏复杂细节。隐式转换使得在调用不存在的方法时依然能够正确执行,例如`1 to 10`,这得益于Int到RichInt的隐式转换。隐式参数则允许方法只需一个参数就能执行,如在汇率计算中的应用。文章讨论了隐式转换的触发时机,包括调用不存在的方法和参数类型不匹配,并给出了实践忠告,建议谨慎使用隐式转换。
摘要由CSDN通过智能技术生成

2、Scala 隐式转换和隐式参数 

隐式转换和隐式参数是 Scala 中两个非常强大的功能,利用隐式转换和隐式参数,你可以提 供优雅的类库,

对类库的使用者隐匿掉那些枯燥乏味的细节。 
 
隐式的对类的方法进行增强,丰富现有类库的功能 
 
是指那种以 implicit 关键字声明的带有单个参数的函数。

可以通过::implicit -v 这个命令显示所有做隐式转换的类。 

 

2.1、Scala 隐式转换探讨 

现在我们来考虑一个问题: 之前讲过:

1 to 10 其实可以写成 1.to(10)

那其实就是表示:1 是一个 Int 类型的变量,所以证明 Int 类中会有一个 to 的方法 但事实上,我们在 Int 类型中根本就没有寻找 to 方法 那也就是说对一个 Int 类型的变量 1 调用 Int 类型不存在的一个方法,这怎么还能正常运行 呢?

原因就是隐式转换 
 
看一个最简单的隐式转换的例子: 

那我们首先来看一下隐式参数: 

package com.mazh.scala.day3 
 
object ImplicitParamTest { 
  // 正常的普通方法 
  def add(x:Int, y:Int) = x + y 
 
  // 柯里化的方法 
  def add2(x:Int)(y:Int) = x + y 
  def add3(x:Int)(y:Int = 10) = x + y 
 
//  如果变成下面这种形式: 
  def add4(x:Int)(implicit y:Int = 10) = x + y 
 
  def main(args: Array[String]): Unit = { 
 
    println ( add (2,3)) 
    // 不能只传一个参数取使用,必须要传入两个参数 
    println ( add2 (2)(3)) 
    println ( add 3 (2)()) 
    // 调用带隐式参数的函数 
    println ( add 4 (2)) 
  } 
}

在上面的代码中,可以看出来,如果对 add2 方法的第二个参数,做了隐式声明,发现之前 需要传入两个参数才能执行的方法 add2 就可以只传入一个参数就能执行计算 
 
那有什么应用场景呢? 比如汇率计算!!!!! 

object ImplicitParamTest2 { 
  /** 
    *  第一个参数是要换算成美元的人民币数目 
    *  第二个参数是汇率 
    */ 
  def rmb(dollar:Double)(implicit rate:Double = 6) = dollar * rate 
 
  def main(args: Array[String]): Unit = { 
 
    println ( rmb (100)) 
    println ( rmb (100)(7)) 
 // 引入隐式转换值,所以第二个参数被隐式的转换成了 6.66 
    import MyPredef._ 
    println ( rmb (100)) 
  } 
} 
 
object MyPredef{ 
  // 声明一个 Double 类型的隐式转换值 
  implicit var current_rate :Double = 6.66 
}

总结:

1、 隐式转换会首先从全局中寻找,寻找不到,才使用隐式参数

2、 隐式转换只能定义在 object 中

3、 如果隐式转换存在二义性࿰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值