scala implicit 关键字用法总结
综述
implicit 关键字是scala中一个比较有特点的关键字,他保证了scala在很多时候没有一些不必要的代码冗余,使得scala在很多时候看起来更加简洁,同时使得scala的一些库在设计的时候,可以有更加直观的操作方法
implicit function 隐式函数
形式
第一种implicit的用法,是将其加在function定义的前面,形式为:
implicit def int2String(someInt: Int): String = {//...
}
作用
这种用法可以用来进行implicit conversion,隐式转换,也就是说,编译器可以选择在合适的时候调用这些函数来进行一个转换,来保证类型的正确性,比如我可以通过定义一个implicit的转换函数将java的类型转换为scala的类型,这样在需要scala类型但是却使用java类型作为参数的时候,编译器会自动加入这个转换函数.
示例:
import scala.language.implicitConversions
//这个import是为了避免出现warning
object Test extends App {implicit def conv(a: Int) = {println("in conv")a.toString}def say(b: String) = println(b)say(5)
}
//输出结果:
// in conv
// 5
//这说明过程是say(conv(5))
//原因是编译器在检查的时候发现需要一个String类型的参数,但是代入的是一个Int,于是
//他会在范围内寻找implicit的function,找到了符合这个要求的String => Int的function,于是调用
implicit parameter & implicit value 隐式参数和隐式值
形式
隐式参数
隐式参数是在函数中,将参数标志出implicit,形式为:
def func(implicit x: Int)
def func2(x: Int)(implicit y: Int)
def func3(implicit x: Int, y: Int)
这三种形式是有区别的,在参数中implicit只能出现一次,而在此之后,所有的参数都会变为implicit。
- func: x是implicit的
- func2: 只有y是implicit的
- func3: x和y都是implicit的
注意避免以下几种错误写法:
//以下三种情况无法编译通过
def err(x: Int, implicit y: Int)
def err(implicit x: Int)(implicit y: Int)
def err(implicit x: Int)(y: Int)
这三种情况都是无法编译通过的
隐式值
形式为:
implicit object Test
implicit val x = 5
implicit var y
作用
这种用法的作用主要是两种用法搭配起来来达到一个效果,隐式参数表明这个参数是可以缺少的,也就是说在调用的时候这个参数可以不用出现,那么这个值由什么填充呢? 那就是用隐式的值了,以下的例子说明了这一点:
object Test extends App {abstract class Sayable {def say}implicit object hello extends Sayable{override def say() = {println("im in hello")}}def func(implicit x: Sayable) {x.say}funcimplicit val impVal = 5def func1(implicit x: Int) = {println(x)}func1
}
输出结果为:
im in hello
5
因为object的类型并不是object的名字,所以使用了一个抽象class来指明type。
在调用func的时候,没有代入参数,其参数是由编译器检查之后决定的,而这里决定的就是唯一的可能,hello那个object,所以这里的say调用的就是hello object里的say
在调用func1的时候,同样没有代入参数,需要一个Int作为参数,编译器寻找值的时候寻找到impVal是implicit的值,所以这里选择impVal作为他的值,输出了5
implicit class 隐式类
这是一个在scala 2.10中新增的用法
形式
implicit class MyClass(x: Int)
作用
这里的作用主要是其主构造函数可以作为隐式转换的参数,相当于其主构造函数可以用来当做一个implicit的function,下面举例说明一下:
object Test extends App {implicit class MyName(x: Int) {println("im in cons")val y = x}def say(x: MyName) = {println(x.y)}say(5)
}
输出结果:
im in cons
5
这里的MyName是一个隐式类,其主构造函数可以用作隐式转换,所以say需要一个MyName类型的参数,但是调用的时候给的是一个Int,这里就会调用MyName的主构造函数转换为一个MyName的对象,然后再println其y的值
总结
我们在这里总结了implicit关键字在scala当中主要的几种用法,虽然没有举出实例,但是基本上对其语法结构和含义有了一些基本的了解,具体的使用还需要我们在实际情况中去体会什么时候需要这样的用法,这样使得代码更加简洁
scala implicit 关键字用法总结相关推荐
- scala 隐式详解(implicit关键字)
掌握implicit的用法是阅读spark源码的基础,也是学习scala其它的开源框架的关键,implicit 可分为: 隐式参数 隐式转换类型 隐式调用函数 1.隐式参数 当我们在定义方法时,可以把 ...
- C# implicit关键字的用法
implicit 关键字用于声明隐式的用户定义类型转换运算符.如果可以确保转换过程不会造成数据丢失,则可使用该关键字在用户定义类型和其他类型之间进行隐式转换.隐式转换可以通过消除不必要的类型转换来提高 ...
- Scala Implicit
2019独角兽企业重金招聘Python工程师标准>>> 序:前段时间用spray的时候对于http请求的参数以及response的结果用json格式的时候遇到了一个隐式转换,又专门查 ...
- Scala Implicit 详解
Implicit 是 Scala 中一个很重要的特性,开始学习 Scala 之前一直以为它和 Java 差不多,然而真的看一些 Scala 的源码时却发现并没有想象中那么简单,所以准备写几篇文章来详解 ...
- implicit的用法
掌握implicit的用法是阅读spark源码的基础,也是学习scala其它的开源框架的关键,implicit 可分为: 隐式参数 隐式转换类型 隐式调用函数 1.隐式参数 当我们在定义方法时,可以把 ...
- Scala Implicit Conversion
2019独角兽企业重金招聘Python工程师标准>>> Scala Implicit Conversion 从一个简单例子出发,我们定义一个函数接受一个字符串参数,并进行输出 def ...
- php全局变量的关键字,PHP变量作用域(全局变量局部变量)globalstatic关键字用法实例分析...
本文实例讲述了PHP变量作用域(全局变量&局部变量)&global&static关键字用法.分享给大家供大家参考,具体如下: 我们知道,变量呢,其实就相当于我们用来储存信息的容 ...
- java private 命名_java private关键字用法实例
这篇文章主要介绍了java private关键字用法实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 package java04; /* * 问 ...
- C++:C++中public protected private关键字用法
C++:C++中public protected private关键字用法 笔者这里主要针对C++中public protected private关键字做一个较全面的总结.首先public prot ...
最新文章
- 如何使用JPA注解标注多对多的关系
- 昨天你用的 YYYY-MM-dd 被捶了吗?
- MySQL数据库提升篇-----触发器
- xz命令--Linux命令应用大词典729个命令解读
- Web的26项基本概念和技术
- ArcGIS怎样获取重分类后各类所占的像元个数
- 嵌入式开发中关键字_IO 和 volatile的用法
- Springboot在线电影系统实战开发
- anr产生的原理如何避免(android)
- 如何通过电影种子名选择合适的电影
- 测试用例设计方法(二)
- 英语学习详细笔记(十)形容词
- 使用1*1卷积实现咖啡豆图像分类
- hp proliant DL360p Gen8风扇故障排除
- 《红楼梦》的方位观念
- Vue3 怎么使用icon阿里字体图标
- DNS服务解析与原理笔记
- 微信小程序图片转换成文字_微信小程序中用canvas将文字转成图片,文字自动换行...
- 手机端页面自适应解决方案
- CorelDRAW看了这个实例教程保证上你对海报制作有新的认识
热门文章
- 深度图像转换为点云数据计算原理及代码实现
- zookeeper启动遇到No such file or directory
- No Source File Named 错误
- DockerCompose快速部署分布式应用,集群部署微服务
- Jupyter Notebook中的Markdown单元格(1)段落-标题-分隔线
- mysql 自定义函数实例_mysql自定义函数原理与用法实例分析
- (JAVA编程练习):输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
- Centos8漏扫 ICMP timestamp请求响应漏洞允许Traceroute探测 的解决方法
- shell编程-command命令
- 连接数据孤岛,巨杉数据库与 Tapdata 联合共建开放数据生态