1. 程式人生 > >Scala學習 --------- 隱式轉換(難點)

Scala學習 --------- 隱式轉換(難點)

隱式轉換:如果你希望對某個類進行擴充套件,就可使用隱式轉換語法,進行擴充套件。

隱式轉換案例:

案例1:

implicit class MyRichInt(x:Int){
  //對Int進行擴充套件的一個方法
  def add(a:Int,b:Int)={
    a+b+x
  }
}
def main(args: Array[String]): Unit = {
  //呼叫自己擴充套件的方法
  val sum=1.add(2,3)
  print(sum)
}
隱式擴充套件類注意:
//1、隱式類對Int類進行擴充套件
//2、構造方法中的引數,只能是1個,此引數的型別就是你要擴充套件的型別
//3、編寫萬隱式類之後,型別會自動擴充套件隱式類中的方法
//4、作用範圍是當前類

案例2:

//第一步:先把擴充套件的類編寫出來
package com.zzk3

/**
  * 擴充套件類
  * 希望此類中的方法都擴充套件到Int類中
  */
class MyRichInt1 {

  def add2(a:Int,b:Int): Int ={
    a+b
  }

  def add3(a:Int,b:Int,c:Int): Int ={
    a+b+c
  }

  def add4(a:Int,b:Int,c:Int,d:Int): Unit ={
    a+b+c+d
  }

}
//第二步:隱式轉換方法
implicit def toInt(x:Int)=new MyRichInt1
//第三步:在本類測試
 def main(args: Array[String]): Unit = {
    //呼叫自己擴充套件的方法
    val sum1=1.add2(2,3)
    val sum2=1.add3(2,3,4)
    print(sum1)
    print(sum2)
 }

隱式引數,隱式值(形參,實參)

概念:只能給型別定義值,如果你給某個型別定義了值後,在呼叫方法時候沒有傳實參,則自動呼叫隱式引數的值。

案例:

package com.zzk3

class Test2 {
  //方法:隱式引數
  def add(implicit a:String)={
    print("----->"+a)
  }
}

object Test3{
  def main(args: Array[String]): Unit = {

    //隱式值
    implicit var ssss:String="lisi"
    implicit var s1:Int=12
    val t2=new Test2
    //正常使用
    //t2.add("你好")
    //非正常使用
     t2.add
  }
}

注意:同一個作用域內只能有一種型別的一個隱式值