1.什么是隐式转换和隐式参数?
隐式转换是以implicit 声明的带有单个参数的函数
隐式参数是函数或方法带有一个标记为implicit 的参数列表
隐式转换函数是在同一个作用域下,一个给定输入类型并自动转换为制定返回类型的函数,这个函数和函数名字无关,和入参名字无关,只和入参类型及返回类型有关.
2.隐式转换有设么作用?
- 隐式转换可以用于类型之间做转换
implicit def int2Fraction(n : Int) = Fraction(n,1)
val result = 3 * Fraction(4,5)
Int 3 被转换成一个Fraction对象
- 可以丰富现有类的功能
class RichFile( val from : File){
def read = Source.fromFile(from.getPath).mkString
}
implicit def file2RichFIle(from: File) = new RichFile(from)
new File("README")'.read //调用file2RichFile 因为File 没有read 方法
- 隐式对象可以自动被呼出用于执行转换或其他任务
- 什么情况下会调用隐式转换?
- 表达式类型与预期类型不同
- 当对象访问一个不存在的成员时:
- 当对象调用某个方法,而该方法的参数声明与传入参数不匹配
- 隐式参数用在哪里?
使用Curying定义一个隐式调用函数
case calss Delimilters(left : String, right: String)
def quote(what: String)(implicit delims: Delimiters) =delims.left + what + delims.right
如果调用quote函数时,附加隐式函数,则自动在系统中寻找类型为Delimiters的隐式值.
implicit val quoteDelimiters = Delimiters("<",">")
quote( "test for this") // 实际上运行的是 quote("test for this")(Delimiters("<",">"))