scala中的隐式转换

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方法.
发布了51 篇原创文章 · 获赞 9 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_43316411/article/details/89186698
今日推荐