
scala隐式类型转换和隐式参数
发布日期:2021-05-07 11:59:30
浏览次数:15
分类:原创文章
本文共 1433 字,大约阅读时间需要 4 分钟。
隐式类型转换
应用场景
隐式类型转换常用于不同类型间数据的相互转化。
例如,如果要将一个Double类型的数据赋值给Int类型的变量:
var number:Int = 40.3
这样写会报错,如果需要将Double类型的数据转化为Int类型,可以使用:
40.3.toInt
但是如果要将Double类型的数据自动转换为Int类型的数据,这时候就要用到隐式转换。
隐式转换的实现
implicit def doubleToInt(a:Double)={ a.toInt }
定义该方法后,在该作用域中,Double类型的数据就可以自动转换为Int类型的数据。
var number:Int = 40.3 println(number)
注意
- 如果要使用隐式转换,必须和所使用的隐式转换方法在同一作用域内,必要时可以使用import来导入所要使用的隐式转换方法。
- 隐式转换只能在无其他可用转换的前提下才能操作。如果在同一作用域里,对同一源类型定义一个以上的隐式转换函数,如果多种隐式转换函数都可以匹配,那么编译器将报错,所以在使用时请移除不必要的隐式定义。
隐式参数
应用场景
柯里化函数会有多个参数列表,当希望对某个参数列表采用默认参数时,可以使用implicit提供的隐式参数功能。做法是在需要自动填充的参数列表最开端加上implicit,然后在定义域内定义需要填充的默认参数值常量,并在常量的定义之前声明implicit。但是在使用隐式参数的时候,该参数必须写在柯里化函数所对应参数的最后一位,不然会报错。
隐式参数的分析及实现
隐式函数和普通柯里化函数的区别:
普通柯里化函数定义及其返回值:
def temp(a:Int)(b:Int)={ a*b } val a1: Int => Int = temp(1)
隐式函数定义及其返回值:
def sum(a:Int)(implicit b:Int = 20): Int ={ a*b } val result: Int = sum(2)
普通柯里化函数在只赋一个参数的情况下,返回的是一个函数,但是隐式函数返回的是一个值。
隐式参数的作用域:
样例代码:
implicit val c = 30 def sum(a:Int)(implicit b:Int = 20): Int ={ a*b }println(sum(2))
分析:
- 执行println(sum(2)(3)),运行结果为6,优先级:实参大于形参。
- 在不定义隐式变量c获取执行println(sum(2)())的情况下,运行样例代码,运行结果为40。
- 在定义隐式变量c的情况下,运行样例代码,运行结果为60。
- 如果在同一作用域内定义了两个相同类型的隐式变量,那么在使用隐式变量的时候会报错。例如:
implicit val c = 30implicit val b = 40 def sum(a:Int)(implicit b:Int = 20): Int ={ a*b }println(sum(2))
同一个作用域内不能出现两个相同类型的隐式变量,如果真的存在,使用隐式参数的类型和隐式变量的类型是否一致,如果一致,调用包含隐式参数的函数的时候,要注意!!!
优先级:
实参>上下文(作用域中)隐式变量>隐式参数
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2025年03月29日 15时19分01秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
常用正则表达式
2019-03-04
C#中换行的代码
2019-03-04
用正则表达式过滤多余空格
2019-03-04
XML:采用XHTML和CSS设计可重用可换肤的WEB站点
2019-03-04
U盘“无法识别的USB设备”解决办法
2019-03-04
【springmvc】传值的几种方式&&postman接口测试
2019-03-04
泳道图简介
2019-03-04
Tomcat6中web项目部署路径webapps和wtpwebapps的区别
2019-03-04
Java判断字符串是否为金额
2019-03-04
CodeCombat代码全记录(Python学习利器)--安息之云山峰(第四章)代码9
2019-03-04
skyfans之每天一个Liunx命令系列之二:uptime
2019-03-04
Kubernetes十三--Pod定义文件内容详解
2019-03-04
3、69道Spring面试题及答案
2019-03-04
普歌- LRF-(简单易懂)笔记本电脑USB接口案例 接口多态(向下转型)
2019-03-04
Java中如何构建树结构
2019-03-04
若依启动流程
2019-03-04
解决vue部署到nginx后刷新404
2019-03-04
解决eclipse字体背景变红或者变绿的问题
2019-03-04
一个面试大牛的经历
2019-03-04