scala學習筆記 十三 implicit 詳解

2021-09-02 18:20:42 字數 1648 閱讀 5634

implicit 可分為三種隱式引數 隱式轉換型別 隱式呼叫函式

1、隱式引數

implicit引數都是定義在方法最後,修飾implicit表示該組引數是隱式引數。乙個方法只會有乙個隱式引數列表,置於方法的最後乙個引數列表。如果方法有多個隱式引數,只需乙個implicit修飾即可

//使用隱式引數的方式 需要在外部定義乙個comparator[a]型別的變數

def maxthrid[a](first: a, second: a)(implicit cp: comparator[a]) =

//使用implicitly方法

//implicitly是在predef.scala裡定義的,它是乙個特殊的方法,編譯器會記錄當前上下文裡的隱式值,而這個方法則可以獲得某種型別的隱式值

def maxone[a: comparator](first: a, second: a) =

//在內部定義函式並宣告隱式引數,這種做法只是把外部方法的隱式引數隱藏了,放到內部巢狀函式上

def maxtwo[a: comparator](first: a, second: a) =

def main(args: array[string])

println(maxone(2, 3))

println(maxtwo(4, 1))

}

2、隱式轉換型別

把變數轉換成我們預期想要的型別

//隱式地轉換型別

implicit def doubletoint(a:double):int = a.toint

//這裡3.5就會轉換成int型別,如果沒有上面的隱式轉換就會編譯出錯

val i:int = 3.5

println(i)

3、隱式呼叫函式

就是我們使用的物件可能不存在某個方法,但是另外乙個物件存在,那麼我們隱式的轉換成那個存在某個方法的物件,來進行操作

class *****

class dog

object implicit*****

//隱式呼叫函式 dog並沒有say函式,但是通過dogto*****隱式方法轉換成*****例項就存在say方法

//編譯器通過隱式轉換將物件轉換成具有這個方法的物件

val d = new dog

import com.aralbox.scala.study42.implicit*****._

d.say

4、下面是更複雜的例子

package com.aralbox.scala.study42

object implicittype

}trait show[t]

object show

//隱式轉換show[string]

implicit def strshow: show[string] = new show[string]

def shoutystringshow: show[string] = new show[string]

}case class person(name: string, age: int)

object person

}

Scala學習筆記

scala學習筆記 一.scala中集合的常用方法 首先定義兩個陣列集合,用於測試 scala val arr1 array 1,2,3,4 arr1 array int array 1,2,3,4 scala val arr2 array 3,4,5,6 arr2 array int array ...

Scala學習筆記

1 閉包 var a 3 var addfun x int x a var b addfun 10 println b addfun 就是個和物件無關的函式,區域性變數,使用方法和函式一樣,但是好像不推薦這種寫法。2 類的建立,簡單使用abstract class bparent 構造函式引數會自動...

Scala 學習筆記

object a val u fab 15,list 1,1 val f p int print p t 變長引數 def sum nums int int int def main args array string unit def f p int int print f 4 object ab...