Scala隐式转换

发布于:2021-10-24 11:09:58

参考《快学Scala》和其他同学的一些博客


隐式转换和隐式参数是Scala的两个重要功能,我们可以利用隐式转换来丰富现有类的功能,以及隐式对象可以自动呼出用于执行转换或其他任务;我们可以提供优雅的类库,对类库的使用者隐藏掉那些枯燥乏味的细节。


scala提供了implicit关键字


一、隐式类

Scala2.10以后提出了隐式类,可以使用implicit声明类,隐式类非常强大,同样可以扩展类的功能,比前面使用隐式转换丰富类库功能更加方便,在集合中隐式类会发挥重要的作用


1.隐式类小例子:



2.隐式类的限制条件:


(1)只能在别的trait/类/对象内部定义,它不能是一个顶级类


(2)构造函数只能携带一个非隐式参数。


(3)在同一作用域内,不能有任何方法、成员或对象与隐式类同名。


?


二、隐式函数

1.隐式函数是什么?


隐式转换函数是以implicit关键字作用于带有单个参数的函数上。这种函数将会自动应用将值从一种类型转换为另外一种类型。(相当于将一种类通过一种函数变为了另一种类)


例:编写隐式函数支持由Double=>Int的转换



2.隐式函数的注意事项:


(1)隐式转换函数与函数名无关,只与函数签名(函数参数类型,函数的返回值类型)有关。


(2)隐式转换函数可以有多个(隐式转换列表),但是需要保证当前环境下只有一个隐式函数被识别(不要引起歧义)。


例:还是上一个例子(报错)



3.利用隐式转换丰富现有类库的功能


如果需要为一个类动态的添加方法,可以通过隐式转换来实现。


例:在Scala中,可以定义一个经过丰富(定义了想要添加的方法)的类,提供我想要的功能。


class RichFile(val from:File){//定义了想要添加的方法
def read=Source.fromFile(from.getPath).mkString
}

通过隐式转化可以将原来类型(File)转换到现在的类型(RichFile),使原来的类的对象可以调用read方法


implicit def fileTorichFile(from:File)=new RichFile(from)

4.引入隐式转换的方式:



?




5.隐式转换规则


隐式转换在如下三种各不相同的情况会被考虑:


(1)当表达式的类型与预期的类型不同时


(2)当对象访问一个不存在的成员时(类似于上面丰富类库的情况)


(3)当对象调用某个方法,而该方法的参数声明和传入参数类型不匹配的情况


?

三、隐式值

隐式值也叫隐式变量,将某个
形参变量标记为implicit,所以编译器会在方法
省略参数的情况下去搜索作用域内的隐式值作为省缺参数


1.小例子:


object demo2 {
implicit val name:String="Nelson"
def sayHello(implicit name:String):Unit={
println("Hello,"+name)
}
def main(args: Array[String]): Unit = {
sayHello
}
}





2.总结一下隐式值的注意事项:


(1)同时出现隐式值、默认值、传值时,编译器的优先级为:
传值 >隐式值>默认值(
优先级一定要分清
)


(2)隐式匹配时,不能有二义性


(3)如果隐式值、默认值、传值都没有的情况下,使用隐式值的地方便会报错

相关推荐

最新更新

猜你喜欢