Scala中的隱式轉換函式、隱式引數和隱式類
阿新 • • 發佈:2018-12-10
所謂隱式轉換函式指的是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方法
*/
}