天天看點

scala隐式參數、隐式函數、隐式類詳解隐式參數隐式函數隐式類

scala關鍵字"implicit"詳解

  • 隐式參數
    • 定義
    • 示例
  • 隐式函數
    • 定義
    • 示例
      • 類型轉換
      • 類型增強
  • 隐式類
    • 定義
    • 示例

隐式參數

定義

1、定義一個普通變量,使用 implicit 關鍵字修飾,定義一個函數調用這個變量當參數時,此時這個參數就被稱為隐式參數

2、隐式參數的作用:減少提供函數參數的數量,讓某些參數擁有隐藏的值(隐式變量)

示例

def main(args: Array[String]): Unit = {
   //隐式參數(每種類型隻能有一個)
    implicit var a:Int = 10
    implicit var str:String = "hello"

    def fun(a:Int,b:Int)(implicit c:Int=5):Int={
      a+b+c
    }
    def fun2(a:Int,b:Int)(c:Int):Int={
      a+b+c
    }
    def fun3(a:Int,b:Int)(implicit c:Int=5,str:String):Int={
      println(str)
      a+b+c
    }
    //優先級:傳參  >  隐式參數  >  預設
    println("fun結果:"+fun(10,10))   //30 調用隐式參數10   //25  預設指派5
    println("fun結果:"+fun(10,10)(20)) //40 傳參20
    println("fun2結果:"+fun2(10,10)(20))
    println("fun3結果:"+fun3(10,10))
    println("fun3結果:"+fun3(10,10)(20,"heheda"))
}
           
scala隐式參數、隐式函數、隐式類詳解隐式參數隐式函數隐式類

注:

  • 1、這裡定義的變量名是 a,但是傳入到函數當中,隐式參數名可以不為 a,随便起什麼名字都可以,隻要是 Int 類型就可以
  • 2、在一個類中,定義同一類型的隐式參數隻能有一個,即函數參數清單中同一類型的隐式參數也隻能為一個,多了會打架,比如定義了兩個Int類型的變量當參數,implicit val a:Int = 10, implicit val b:Int = 20 ,傳入到函數中scala編譯就不知道用哪個參數了
  • 3、在一個類中,不同類型的隐式參數可以傳入到函數當中
  • 4、scala中函數的傳參級别: 函數清單傳參 > 隐式參數 > 預設值

隐式函數

定義

1、隐式函數也稱隐式轉換,使用implicit修飾的函數

2、作用:可以通過一個隐式函數将一種類型轉變為另一種類型

3、隐式轉換有兩種應用場景:

  • a)類型轉換,隐式轉換為期望類型
  • b)類型增強

示例

類型轉換

在scala中定義一個隐式函數,函數體是将傳入的 Double 類型使用 toInt 方法轉為 Int 類型

def main(args: Array[String]): Unit = {
    //隐式函數
    //類型轉換:Double --> Int
    implicit def DoubleToInt(a: Double) = {a.toInt}  //定義隐式函數

    val x: Int = 3.5 //寫的時候scala就調用了隐式函數 doubleToInt 進行類型轉化
    println(x)
}
           
scala隐式參數、隐式函數、隐式類詳解隐式參數隐式函數隐式類

常用的類型轉換:

implicit def doubleToString (obj:Double):String=obj.toString 
implicit def intToString(obj:Int):String=obj.toString 
implicit def stringToInt(obj:String):Int=Integer.parseInt(obj)
           

類型增強

定義一個隐式函數,使 “true=1,false=0” ,此時便可提供一個隐式函數,使得Int+Boolean成立

def main(args: Array[String]): Unit = {
    //隐式函數
   //類型增強
    implicit def BooleanToInt(x:Boolean) = if(x) 1 else 0
    println(1+true)
    println(1+false)
}
           
scala隐式參數、隐式函數、隐式類詳解隐式參數隐式函數隐式類

注: 隐式轉換的發生時機

  • 1、當方法中的參數的類型與目标類型不一緻時
  • 2、當對象調用類中不存在的方法或成員時,編譯器會自動将對象進行隐式轉換

隐式類

定義

1、隐式類指的是用implicit關鍵字修飾的類。

2、在對應的作用域内,帶有這個關鍵字的類的主構造函數可用于隐式轉換。

示例

package nj.zb.kb09.implicitdemo

class Demo2{

}

object Demo2 {
  def main(args: Array[String]): Unit = {
    //導包
    import nj.zb.kb09.implicitdemo.Impliciteg2._
    val demo2 = new Demo2
    demo2.aa("abc")
    println(demo2.add(12, 12))
    println(demo2.bb(3))
    println(demo2.login("zs", "123"))
  }
}
           
scala隐式參數、隐式函數、隐式類詳解隐式參數隐式函數隐式類
package nj.zb.kb09.implicitdemo

object Impliciteg2 {

  implicit class Demo2Implicit(demo2:Demo2) {
    def aa(s: String): Unit = {
      println(s)
    }

    def bb(num: Int):String = {
      if (num % 2 == 0) "偶數"else "奇數"
    }

    def add(num1: Int, num2: Int): Int = {
      num1 + num2
    }
  }
  implicit class Demo2Implicit2(demo2:Demo2){
    def login(name:String,pwd:String):Boolean={
      if (name.equals("zs") && pwd.equals("123")) true else false
    }
  }
}
           
scala隐式參數、隐式函數、隐式類詳解隐式參數隐式函數隐式類

參考部落格:https://blog.csdn.net/and52696686/article/details/107618593