scala中的隐式转换分为三种
1. 隐式参数
2. 隐式的类型转换
3. 隐式类
1.隐式参数
方法的参数是隐式参数,如果你没有传递参数的话,编译器在编译的时候会自动的从当前的上下文中找一个隐式值(符合参数的类型的隐式值)不能同时有多个符合的条件,因为编译器没有办法判断谁是更合适的。
//say、add、add1方法就是隐式参数
def say(implicit content:String) = println(content)
def add(a:Int)(implicit b:Int) = a + b
//add1是柯西方法,对多个参数进行隐式,只需要一个implicit表示即可
def add1(a:Int)(implicit b:Int,c:Int) = a + b + c
def main(args: Array[String]): Unit = {
implicit val name = "dajsdnas"
say("niajsjd")
say
println(add1(1))
}
}
2.隐式的类型转换
implicit def double2Int(a:Double) = a.toInt
//这个会自动去寻找上面的隐式类型转换方法,自动将20.5转换为Int
val age:Int = 20.5
println(age)
最后结果是:20
第二个例子:隐式类型转换的实例,File类中本来没有count方法,但是转换成RichFile后就多了count方法
package ImplicitTest
/**
*隐式类型转换的实例
* File类中本来没有count方法,但是转换成RichFile后就多了count方法
*/
import java.io.{BufferedReader, File, FileReader}
import scala.io.Source
class RichFile(file:File){
def count():Int = {
val fileReader = new FileReader(file)
val bufferedReader = new BufferedReader(fileReader)
var sum = 0
try {
var line = bufferedReader.readLine()
while (line != null) {
sum += 1
line = bufferedReader.readLine()
}
}catch {
case _:Exception => sum
} finally{
fileReader.close()
bufferedReader.close()
}
sum
}
}
object Test1{
implicit def file2Richfile(file: File) = new RichFile(file)
def main(args: Array[String]): Unit = {
val file = new File("C:\\Users\\liu-xiao-ge\\Desktop\\计划.txt")
println(file.count())
}
}
3.隐式类(隐式类必须在对象中,隐式类和隐式转换类型作用大同小异,两个都可以使用)
object Test1{
implicit class FileRead(file: File){
def read = Source.fromFile(file).mkString
}
``def main(args: Array[String]): Unit = {
val file = new File("C:\\Users\\liu-xiao-ge\\Desktop\\计划.txt")
println(file.read)`
隐式类再举一个简单易懂的例子:
package ImplicitTest
object L {
implicit class Int2String(x:Int){
def add_10(a:Int): String = (x+a)+"-"
}
def main(args: Array[String]): Unit = {
val z :Int = 6
//z就是传入隐式类的参数,即z就是上面的x,5是传入方法的参数
println(z.add_10(5))
}
}
当z.add_10(5)时,自动会上上下文中寻找implicit方法.