1. 程式人生 > >Scala中的隱式轉換函式、隱式引數和隱式類

Scala中的隱式轉換函式、隱式引數和隱式類

所謂隱式轉換函式指的是implicit關鍵字修飾的且只有一個引數的函式。 例如:

inplicit def int2String(n:Int):String = (n.toString)

上案例:我們把Fruit物件轉換成了Monkey物件

//Scala的隱式轉換

//水果
class Fruit(name:String){
  def getFruitName():String = {name}
}

//猴子Monkey
class Monkey(f:Fruit){
  def say() = {println("Monkey like " + f.getFruitName())}
}

object
ImplicitDemo {
implicit def fruitToMonkey(f:Fruit):Monkey = {new Monkey(f)} def main(args: Array[String]) { //建立一個Fruit的物件 var f:Fruit = new Fruit("香蕉") //問題:能否呼叫f.say() 方法呢?解決方法:將Fruit的物件轉換為Monkey的物件 f.say() } }

隱式引數:使用implicit申明的函式引數叫做隱式引數。我們也可以使用隱式引數實現隱式的轉換

//Scala的隱式引數
def testParam(implicit
name:String) = {println("The value is " + name)} //定義一個隱式引數 implicit val name:String="這是一個隱式值" //問題:在呼叫的方法的時候,可以不用傳遞引數嗎? testParam //使用隱式引數實現隱式的轉換 //定義一個方法,找到兩個值中較小的那個值 // 100 23 ---> 23 // Hello ABC ---> ABC def smaller[T](a:T,b:T)(implicit order:T => Ordered[T]) = if(a < b) a else b smaller(100
,23) smaller("Hello","ABC")

隱式類

所謂隱式類: 就是對類增加implicit 限定的類,其作用主要是對類的功能加強!

/**
  * Scala的隱式類
  */
object ImplicitClass {

  //隱式類
  implicit class Calc(x:Int){
    def add(a:Int):Int = a + x
  }

  def main(args: Array[String]) {
    println("兩個數字的和:" + 1.add(2))
  }
  /*
隱式類執行的過程:
1. 當1.add(2),scala的編譯器不會立即報錯;在當前域當中查詢,有沒有implicit修飾的,同時可以將Int作為引數的構造器,
並且具有add方法的類。通過查詢,找到了Calc
2. 利用隱式類Calc來執行add方法
*/
}