scala学习笔记(隐式转换)

隐式函数

使用implicit关键字声明的带有单个参数的函数,会自动运用,将值从一种类型转换为另一种类型

implicit def fun(num:Double):Int=num.toInt+1
var num:Int = 3.5
//输出4.5

注意:
隐式转化与函数名无关,只与参数类型和返回值类型有关
隐式函数可以有多个,但必须保证当前域只有一个被识别

隐式值

将某个形参变量标记为implicit,当编译器在方法省略隐式参数时,搜索域中的隐式值作为缺省参数

implicit val str1:String="jack~"
def hello(Implicit name:String):Unit={
    println(name+"hello")
}

//hello("hello")  输出 hellohello
//hello()	输出jack~hello

注意:
当程序中同时又隐式值,默认值,传值时,优先级:传值>隐式值>默认值
隐式值匹配时,不能有二义性(即无歧义)
若三个全都没有,程序报错

隐式类

使用implicit声明类,作用是扩展类的功能

class Dog{}

object Test{
implicit class(obj:Dog){
	def yap():Unit=println("狗吠")
}
}

object Person{
def main(arg:String[]):Unit={
	import Test._ 
	val a = new Dog();//当实例化Dog的对象时,隐式类自动匹配
	a.yap()//输出		狗吠
}
}

注意:
隐式类所带的构造参数有且只有1个
隐式类不能是顶级的
隐式类不能是样例类
作用域类不能有与之相同的标识符
注意import包中带有的隐式类

隐式解析机制

编译器如何查找隐式信息

  1. 首先会在当前代码作用域下查找隐式实体(隐式方法、隐式类、隐式对象)。(一般是这种情况

  2. 如果第一条规则查找隐式实体失败,会继续在隐式参数的类型的作用域里查找。类型的作用域
    是指与该类型相关联的全部伴生模块,一个隐式实体的类型T 它的查找范围如下(第二种情况范围广且 复杂在使用时,应当尽量避免出现):
    a) 如果 T 被定义为 T with Awith B with C,那么 A,B,C 都是 T 的部分,在 T 的隐式解析过程中,
    它们的伴生对象都会被搜索。
    b) 如果 T 是参数化类型,那么类型参数和与类型参数相关联的部分都算作 T 的部分,比如
    List[String]的隐式搜索会搜索 List 的伴生对象和 String 的伴生对象。
    c) 如果 T 是一个单例类型 p.T,即 T 是属于某个 p 对象内,那么这个 p 对象也会被搜索。 d) 如果 T 是个类型注入 S#T,那么 S 和 T 都会被搜索

隐式转换需要遵循的原则:
1.不能有二义性
2.隐式操作不能嵌套使用

你可能感兴趣的:(scala)