Scala--隐式转换和隐式值--笔记

隐式转换

一个小问题:
先看一段代码
从高精度向低精度转换,出错
在这里插入图片描述
隐式转换函数是以 implicit 关键字声明的带有单个参数的函数,这种函数将会自动应用,将值从一种类型转换为另一种类型,
要注意需要有返回类型和返回值

小案例:
在这里插入图片描述
源码:
在这里插入图片描述
隐式转换的注意事项:
1)隐式转换函数的函数名可以任意,隐式转换与函数名无关,只与函数签名(签名即函数参数类型和返回值类型)有关

2)隐式转换函数可以有多个,但匹配只能是唯一的
可以有多个函数指:可以有将double 型转换成 Int ,Float 转换为 Int 这样的多个隐式转换函数
匹配唯一指:不可以有多个作用相同的隐式转换函数

用隐式转换 丰富类库功能
因为有了先入为主的概念,我刚开始只觉得隐式函数只能做一些数据类型的转换,并没有太大用处,但是继续学习,发现这个功能真的是很好,不得不佩服开发者马丁
比如下面的案例:
MySql 并不能调用Oracle 中的 delete 方法
在这里插入图片描述
如何可以让 Mysql 的实例对象调用 Oracle 中的方法呢?
这里就可以用到 隐式转换

在这里插入图片描述

隐式值

隐式值也叫隐式变量,将某个形参变量标记为 implicit
编译器会在方法省略隐式参数的情况下去搜索作用域内的隐式值作为缺省参数
可以作用在多个函数形参
在这里插入图片描述
上面调用hello 方法时,不需要带() ,带()就会发生错误

隐式值的优先级和一些注意事项:

同一作用域内不可以有多个类型相同的隐式值
在这里插入图片描述
当同时有隐式值和默认值时,implicit(隐式值的默认值高)

在这里插入图片描述

当匹配不到隐式值,仍会使用默认值:
在这里插入图片描述
当没有默认值,也没有匹配到隐式值时,就会报错

在这里插入图片描述

小结:
1)当程序中,同时有 隐式值,默认值,传值时
2)编译器的优先级为 传值 > 隐式值 > 默认值
3)在隐式值匹配时,不能有二义性(不能同时匹配多个值)
4) 隐式值,默认值,传值 都匹配不到时,就会报错

隐式类

声明隐式类: implicit 类
在这里插入图片描述
特点:
1)隐式类所带的构造参数有且只能有一个
2)隐式类必须被定义在 “类” 或 “伴生对象” 或 “包对象” 里,即 隐式类不能是顶级的,这样就会失去作用域
3)隐式类 不能是 case class
4)作用域内不能有与之相同名称的标识符

隐式的转换时机

1)当方法中的参数的类型 与 目标类型 不一致时
2)当对象调用 所在类中不存在的方法或成员时,编译器会自动将对象进行隐式转换

注意:隐式操作不能嵌套
在这里插入图片描述

----观看韩顺平老师Scala课程笔记

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值