参考《快学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.引入隐式转换的方式:
三、隐式值
object demo2 {
implicit val name:String="Nelson"
def sayHello(implicit name:String):Unit={
println("Hello,"+name)
}
def main(args: Array[String]): Unit = {
sayHello
}
}