1、隐式转换(implicit)----给对象动态的增加方法
当编译器第一次编译失败的时候,会在当前的环境中查找能让代码编译通过的方法,用于将类型进行转换,实现二次编译
隐式转换可以在不需改任何代码的情况下,扩展某个类的功能
1)、隐式转换函数
2)、隐式转换变量
3)、隐式转换类
2、隐式转换函数
//在一个作用域内,只能存在一个同类型(函数参数类型和返回值类型)的隐式转换函数 //自动调用实现的
:调用的方法需要传入Int,但是给了String, // 所以scala在编译时会自动寻找一个隐式转换函数,参数类型为String
//返回值类型为Int的函数自动调用隐式转换函数实现转换
def func1(i: Int): Int = {
i + 100
}
//定义一个函数,使用implicit修饰表示隐式函数
implicit def fun(str: String): Int = {
Integer.parseInt(str)
}
println(func1(10))
//println(func1("123")) //传入字符串则函数不能调用
//println(func1("20".toInt)) //手动转换类型去实现传入字符串
//println(func1(fun("30"))) //通过函数实现转换
println(func1("40"))
3、隐式转换变量
//定义一个函数,传入两个参数函数,相当于两个函数,后缀
def func2addSuffix(str1: String)(implicit str2: String): String = {
str1 + str2
}
println(func2addSuffix("Java")("编程语言"))
println(func2addSuffix("hive")("数据仓库"))
//println(func2addSuffix("Hadoop")) //传入一个参数报错
//定义一个隐式转换变量
implicit val str: String = "默认隐式转换变量的后缀"
/**
* 方法本来需要调用两次的,由于第二次的调用在定义时参数加了implicit隐式关键字
* 那么调用时传入参数少了就会自动的去寻找当前作用域范围内是否有一个隐式转换的变量
* 有的话就直接加上,自动调用,没有则传入参数不对直接报错
*/
println(func2addSuffix("Hadoop")) //直接就可以调用了
4、隐式转换类
val readfile1: ReadFile = new ReadFile("data/students.txt")
readfile1.read().foreach(println)
/**
* 将类声明为隐式转换implicit的
* 由于类中的构造为传入一个的String的
* 所以作用域内所有的String类型的变量都具有类中的方法
*
* 注意:被implicit修饰的类的参数只能由一个参数
*/
"data/score.txt".read().foreach(println)
}
//定义一个类用于读取文件,属性为一个String类型
implicit class ReadFile(path: String) {
//定义一个read方法,传入参数路径读取文件数据
def read(): List[String] = {
val bs: BufferedSource = Source.fromFile(path)
val listFile: List[String] = bs.getLines().toList
bs.close()
listFile
}
}