隐式转换
一、定义
当scala编译器第一次编译失败的时候,会在当前的环境中查找能让代码编译通过的方法,用于将类型进行转换,实现二次编译。(类似于一个整数和一个浮点数相加,编译器可以自动把整数转换为浮点数。)
scala中 1 to 10的写法就是用了隐式转换,实际是1.to(10),Int类型的1调用了RichInt的to()方法
二、作用
隐式转换可以在不需要改任何代码的情况下,扩展某个类的功能,对类的方法进行增强,常用作类型转换也就是把一个类型转赋予另一个类的功能;(声明一个新的类,类型类中定义需要的方法,再声明一个隐式函数,函数体中将原本的对象类型转换成新定义类的类型,这样就可以调用新类中的方法,实现类功能扩展)
三、类型
隐式函数:使用implicit关键字声明的只有一个参数的函数称之为隐式函数;
隐式参数: 普通方法或者函数中的参数可以通过implicit关键字声明为隐式参数,调用该方法时,就可以传入该参数,编译器会在相应的作用域寻找符合条件的隐式值;
1、同一个作用域中,相同类型的隐式值只能有一个;
2、编译器按照隐式参数的类型去寻找对应类型的隐式值,与隐式值的名称无关;
3、隐式参数优先于默认参数
隐式类:scala 2.10后开始提供隐式类
1、其所带的构造器有且只能有一个;
2、隐式类必须被定义在类或伴生对象或包对象里,即隐式类不能是顶级的;
四、机制
1、首先会在当前代码作用域下查找隐式实体(隐式方法、隐式类、隐式对象)
2、如果第一条规则查找隐式实体失败,会继续再隐式参数的类型的作用域里查找。类型的作用域是指该类型相关联的全部伴生对象以及该类型所在包的包对象。
五、例子
隐式函数:
隐式类:
隐式参数:
输出结果:
这里调用sayHi方法输出的结果显示name参数使用的是隐式参数值而不是默认值,说明隐式参数优先于默认参数。