scala implicit关键字详解(隐式转换函数、隐式类、隐式参数、隐式值)

scala implicit关键字详解(隐式转换函数、隐式类、隐式参数、隐式值)

一、Overview

implicit是scala中的一个关键字,关于它有着丰富的用法,使得scala更灵活和容易扩展。截止目前,scala已经来到了2.12.3版本,本篇文章把目前scala支持的implicit用法作了较为全面的整理,以方便在阅读scala源码的时候稍作参考。文中全部的代码和测试结果均以scala2.12.3为准。

闲话不多讲,目前可以见到的implict用法有如下几种:

1.隐式转换函数

implicit def int2str(x:Int):String = x.toString

2.隐式类

implicit class Box(x: Int) {
       
}

3.隐式参数

def compare[T](x:T,y:T)(implicit ordered: Ordering[T]):Int = {
  ordered.compare(x,y)
}

4.隐式值

implicit val x: Int = 0

5.隐式对象

implicit object obj {
   
}

6.context bound

def compare2[T: Ordering](x: T, y: T) = {
  val ord = implicitly[Ordering[T]]
  ord.compare(x, y)
}

先不用着急理解这些代码的含义,下面会逐一讲解。

二、隐式转换函数

首先来看隐式转换函数。

implicit def int2str(x:Int):String = x.toString

这段代码声明了一个函数int2str,它与正常函数唯一的区别在于前面多出的implicit关键字。这里的implicit就是它字面的含义——隐式,它告诉编译器,这个函数是一个隐式转换函数,能够把Int类型的值转换成String类型的值。

这种隐式转换的意义在于,如果在进行一个对Int类型的操作时不合法,编译器会在当前作用域寻找合适的隐式转换,来尝试使这种操作合法。隐式转换发生在这两种情景:

  • e是一个S类型的表达式,而需要的却是T类型,编译器会寻找S=>T的隐式转换
  • e是一个S类型的表达式,使用点号访问e.m时,m不是类型S的成员,编译器会寻找合适的隐式转换使e.m合法

隐式转换最常用的用途就是扩展已有的类,在不修改原有类的基础上为其添加新的方法、成员。

例如上面的这个函数,在为Int类型定义好到String类型的隐式转换后,所有String类型支持的操作都可以直接在Int类型的值上使用:

10.concat(
  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值