开发者学堂课程【Scala 核心编程-基础:隐式转换的时机和机制】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/609/detail/9011
隐式转换的时机和机制
内容介绍
一、隐式的转化时机
二、隐式解析机制
一、隐式的转化时机
1、当方法中的参数的类型与目标类型不一致时,会产生隐式转换。
2、当对象调用所在类中不存在的方法或成员时,编译器会自动将对象进行隐式转换(根据类型)。
3、假如没有 mySQL . addSuffix( ),那么 new mySQL1不会跟 DB1发生关联消息,但是 sayok()没有下划线,addsuffix()有下划线,编译器扫描 mySQL 的作用域发现,有一个隐式类可以用。
//创建一个 MySQL1实例
val mySQL =
new MySQL1
mySQL . sayOk( )
mySQL.addsuffix()
//研究如何关联到 DB1$I (mySQL). addsuffix();
4、当方法中的参数的类型与目标类型不一致时也会转换。
implicit def f1(d: Double): int={接收 double 类型
d
.
to
int
}
Def
test1(n1: Int): Unit
={
println("ok'
)
}
Test1(10.1)理论上报10是对的,但是报1就错了,类型不匹配,隐式类型会出现。在范围内去找,找到就会用,找不到就报错。
赋值的本质,底层也可能是一个函数。
}
}
class DB1
{}
成功运行。
5、整理
(1)当方法中的参数的类型与目标类型不一致时,或者是赋值时。
implicit def f1(d:Double): Int =
{
d. toInt
}
def test1(n1:Int): Unit =
{
println("ok")
}
test1(10.1 )
(2)当对象调用所在类中不存在的方法或成员时,编译器会自动将对象进行隐式转换(根据类型)
二、隐式解析机制
即编译器是如何查找到缺失信息的,解析具有以下两种规则:
1、首先会在当前代码作用域下查找隐式实体(隐式方法、隐式类、隐式对象)(一般是这种情况)。
2、如果第一条规则查找隐式实体失败,会继续在隐式参数的类型的作用域里查找。类型的作用域是指与该类型相关联的全部伴生模块,一个隐式实体的类型T它的查找范围如下(第二种情况范围广且复杂在使用时,应当尽量避免出现第二种情况):
(1)如果 T 被定义为 T with A with B with C,那么 A,B,C 都是 T 的部分,在 T 的隐式解析过程中,它们的伴生对象都会被搜索。
(2)如果 T 是参数化类型,那么类型参数和与类型参数相关联的部分都算作T的部分,比如 List[String]的隐式搜索会搜索 List 的伴生对象和 String 的伴生对象。
(3)如果T是一个单例类型 p.T,即 T 是属于某个 p 对象内,那么这个 p 对象也会被搜索。
(4)如果 T 是个类型注入 S#T,那么 S 和 T 都会被搜索。
主要是第一种要了解,第二种直到即可,正常情况下,不会用这么复杂的解析。