/
* 隐式方法/隐式函数*:悄悄的将一个类型转为另一个类型
语法: implicit def 方法名(参数名:待转换类型):目标类型 = {….}
隐式方法的调用时机:
在当前作用域内寻找有没隐式函数:
1、当前类型与目标类型不一致的时候会自动调用隐式转换方法
* 2、对象使用了不属于自身的属性与方法/函数的时候会自动调用隐式转换方法
* **隐式参数**:后期在调用方法的,scala会自动传参<br />作用:<br />避免重复定义相同参数<br /><br />语法:<br /> * 1、定义方法: def 方法名(参数:类型,..)(implicit 参数名:参数类型)= {方法体}<br /> * 2、定义参数: implicit val 参数名:类型 = 值,<br />也可以将该参数定义在类中
* **隐式类**: 将一个类型转换为指定类型<br /> * 语法: implicit class 类名(属性名:待转换类型){...}<br /> * 隐式类必须放在object/class中,不能置于最顶层
*** 隐式转换的解析**:<br /> * 1、首先会从当前作用域查找是否有符合要求的隐式转换,如果有直接使用<br /> * 2、如果在作用域外定义隐式转换类,需要import 该类来使用<br />之前的import都是导入包,这里是导入类<br /> * 1、如果隐式转换定义在其他的object中,此时要想使用隐式转换需要导入: import object名称._ /import object名称.隐式转换名称<br /> * 2、如果隐式转换定义在class中,此时要想使用隐式转换,首先需要创建class对象,然后通过: import 对象名._ / import 对象名.隐式转换名称<br /> * 如果符合要求的隐式转换有多个,在导入的时候需要明确指定使用哪个隐式转换【import object名称.隐式转换名称】<br /> */
隐式转换函数
当前作用域隐式转换
package tcode.chapter10import java.io.Fileimport scala.io.Sourceimport com.atguigu.chapter01.implictObject._import com.atguigu.chapter10.$01_ImplicitFunction.RichFileimport tcode.chapter10.$01_ImplicitFunction.RichFileclass implictObject2{object $01_ImplicitFunction {class RichFile(file:File){def getLine():Iterator[String] = {Source.fromFile(file,"utf-8").getLines()}}def main(args: Array[String]): Unit = {// 这里d是Int型,但是传入值是double型,需要隐式转换val d:Int = 10.0println(d)val file = new File("d:/data.txt")file.getLine().foreach(x=>println(x))}// 当前作用域(object $01_ImplicitFunction)的定义隐式方法implicit def file2RichFile(file:File):RichFile = {new RichFile(file)}}
导入object隐式对象的隐式转换
// 隐式转换对象object implictObject{implicit def file2RichFile(file:File):RichFile = {new RichFile(file)}}object $01_ImplicitFunction {class RichFile(file:File){def getLine():Iterator[String] = {Source.fromFile(file,"utf-8").getLines()}}def main(args: Array[String]): Unit = {// 因为是object,提供的是静态方法所以可以直接导入使用objectimport implictObject.file2RichFileval file = new File("d:/data.txt")file.getLine().foreach(x=>println(x))}}
导入class隐式类的隐式转换
// 隐式转换对象class implictObject{implicit def file2RichFile(file:File):RichFile = {new RichFile(file)}}object $01_ImplicitFunction {class RichFile(file:File){def getLine():Iterator[String] = {Source.fromFile(file,"utf-8").getLines()}}def main(args: Array[String]): Unit = {// 因为是Class所以需要new对象才能使用隐式类的方法。val implictClass = new implictObjectimport implictObject.file2RichFileval file = new File("d:/data.txt")file.getLine().foreach(x=>println(x))}}
隐式转换参数
作用域内的隐式参数
package tcode.chapter10object $02_ImplicitParam {/*** 隐式转换参数: 后期在调用方法的,scala会自动传参* 语法:* 1、定义方法: def 方法名(参数:类型,..)(implicit 参数名:参数类型)= {方法体}* 2、定义参数: implicit val 参数名:类型 = 值*/def main(args: Array[String]): Unit = {implicit val z:Int = 100println(add(10, 20))add2(10)(z)add3()(z)}def add(x:Int,y:Int)(implicit z:Int) = x+y+zdef add2(x:Int)(implicit z:Int) = x+zdef add3()(implicit z:Int) = z*z}
作用域外的隐式参数
package tcode.chapter10object $02_ImplicitParam {def main(args: Array[String]): Unit = {//implicit val z:Int = 100// 相同的,如果是importclass需要new对象val implictObject = new implictObject2import implictObject.zprintln(add(10, 20))add2(10)(z)add3()(z)}def add(x:Int,y:Int)(implicit z:Int) = x+y+zdef add2(x:Int)(implicit z:Int) = x+zdef add3()(implicit z:Int) = z*z}
隐式转换(内部类)类
package tcode.chapter10import java.io.Fileimport scala.io.Sourceobject $03_ImplicitClass {implicit class RichFile(file:File){def getLines():Iterator[String] = {Source.fromFile(file,"utf-8").getLines()}}/*** 隐式类: 将一个内部类转换为隐式类* 语法: implicit class 类名(属性名:待转换类型){...}参数只能是一个,而且只能有一个构造器* 隐式类必须放在object/class中,不能置于最顶层*/def main(args: Array[String]): Unit = {val file = new File("d:/data.txt")file.getLines().foreach(println(_))}/* implicit def file2RichFile(file:File):RichFile ={new RichFile(file)}*/}
