博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
scala implicit 关键字
阅读量:6281 次
发布时间:2019-06-22

本文共 1387 字,大约阅读时间需要 4 分钟。

hot3.png

implicit 可分为:

  • 隐式参数
  • 隐式转换类型
  • 隐式调用函数

1.隐式参数

当我们在定义方法时,可以把最后一个参数列表标记为implicit,表示该组参数是隐式参数。一个方法只会有一个隐式参数列表,置于方法的最后一个参数列表。如果方法有多个隐式参数,只需一个implicit修饰即可。 当调用包含隐式参数的方法是,如果当前上下文中有合适的隐式值,则编译器会自动为改组参数填充合适的值。如果没有编译器会抛出异常。当然,标记为隐式参数的我们也可以手动为该参数添加默认值。def foo(n: Int)(implicit t1: String, t2: Double = 3.14)

scala > def calcTax(amount: Float)(implicit rate: Float): Float = amount * ratescala > implicit val currentTaxRate = 0.08Fscala > val tax = calcTax(50000F) // 4000.0

如果编译器在上下文没有找到第二行代码会报错

2.隐式地转换类型

使用隐含转换将变量转换成预期的类型是编译器最先使用 implicit 的地方。这个规则非常简单,当编译器看到类型X而却需要类型Y,它就在当前作用域查找是否定义了从类型X到类型Y的隐式定义 

例子:

scala> val i: Int = 3.5 //直接报错加上这句:scala> implicit def double2Int(d: Double) = d.toInt再运行,没报错scala> val i: Int = 3.5  //i=3

3.隐式调用函数

隐式调用函数可以转换调用方法的对象,比如但编译器看到X .method,而类型 X 没有定义 method(包括基类)方法,那么编译器就查找作用域内定义的从 X 到其它对象的类型转换,比如 Y,而类型Y定义了 method 方法,编译器就首先使用隐含类型转换把 X 转换成 Y,然后调用 Y 的 method。 

例子:

class SwingType{  def  wantLearned(sw : String) = println("兔子已经学会了"+sw)}object swimming{  implicit def learningType(s : AminalType) = new SwingType}class AminalTypeobject AminalType extends  App{  import com.mobin.scala.Scalaimplicit.swimming._  val rabbit = new AminalType    rabbit.wantLearned("breaststroke")         //蛙泳}

上例中编译器在rabbit对象调用时发现对象上并没有wantLearning方法,此时编译器就会在作用域范围内查找能使其编译通过的隐式视图,找到learningType方法后,编译器通过隐式转换将对象转换成具有这个方法的对象,之后调用wantLearning方法

转载于:https://my.oschina.net/u/2000675/blog/1802384

你可能感兴趣的文章
力扣算法题—055跳跃游戏
查看>>
Nginx服务安装指南
查看>>
layer遮罩层 简单的遮罩层
查看>>
vue中使用腾讯云Im
查看>>
java FTP上传文件
查看>>
ubuntu 安装 eslint
查看>>
【转】围观 Joomla, Wordpress 和 Drupal
查看>>
用JS做关灯游戏(初级)
查看>>
vue.js学习 自定义过滤器使用(2)
查看>>
laravel资源
查看>>
各种排序讲解
查看>>
Sql Server 网络配置
查看>>
要在VR潮流中分一杯羹,首先要搞清楚方向再创业
查看>>
vscode setting.jsonxx
查看>>
网站版权日期的处理
查看>>
Maven之debug技巧
查看>>
server2008远程开端口的方法
查看>>
启用用户布局表格
查看>>
Delphi异形窗口之PNG
查看>>
mysql数据库优化(二)
查看>>