/
* 隐式方法/隐式函数*:悄悄的将一个类型转为另一个类型
语法: implicit def 方法名(参数名:待转换类型):目标类型 = {….}
隐式方法的调用时机:
在当前作用域内寻找有没隐式函数:
1、当前类型与目标类型不一致的时候会自动调用隐式转换方法
* 2、对象使用了不属于自身的属性与方法/函数的时候会自动调用隐式转换方法
* **隐式参数**:后期在调用方法的,scala会自动传参<br />作用:<br />避免重复定义相同参数<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/21361442/1622958100145-a4265072-05ed-4aa6-a2d2-a9ba0d2a70db.png#id=XSZlk&margin=%5Bobject%20Object%5D&name=image.png&originHeight=281&originWidth=453&originalType=binary&ratio=1&size=68452&status=done&style=none)<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.chapter10
import java.io.File
import scala.io.Source
import com.atguigu.chapter01.implictObject._
import com.atguigu.chapter10.$01_ImplicitFunction.RichFile
import tcode.chapter10.$01_ImplicitFunction.RichFile
class 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.0
println(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,提供的是静态方法所以可以直接导入使用object
import implictObject.file2RichFile
val 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 implictObject
import implictObject.file2RichFile
val file = new File("d:/data.txt")
file.getLine().foreach(x=>println(x))
}
}
隐式转换参数
作用域内的隐式参数
package tcode.chapter10
object $02_ImplicitParam {
/**
* 隐式转换参数: 后期在调用方法的,scala会自动传参
* 语法:
* 1、定义方法: def 方法名(参数:类型,..)(implicit 参数名:参数类型)= {方法体}
* 2、定义参数: implicit val 参数名:类型 = 值
*/
def main(args: Array[String]): Unit = {
implicit val z:Int = 100
println(add(10, 20))
add2(10)(z)
add3()(z)
}
def add(x:Int,y:Int)(implicit z:Int) = x+y+z
def add2(x:Int)(implicit z:Int) = x+z
def add3()(implicit z:Int) = z*z
}
作用域外的隐式参数
package tcode.chapter10
object $02_ImplicitParam {
def main(args: Array[String]): Unit = {
//implicit val z:Int = 100
// 相同的,如果是importclass需要new对象
val implictObject = new implictObject2
import implictObject.z
println(add(10, 20))
add2(10)(z)
add3()(z)
}
def add(x:Int,y:Int)(implicit z:Int) = x+y+z
def add2(x:Int)(implicit z:Int) = x+z
def add3()(implicit z:Int) = z*z
}
隐式转换(内部类)类
package tcode.chapter10
import java.io.File
import scala.io.Source
object $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)
}*/
}