9恃轩、scala基礎(chǔ)語(yǔ)法-隱式轉(zhuǎn)換

1、隱式轉(zhuǎn)換介紹

object Scala01_implicit {
  def main(args: Array[String]): Unit = {
    //隱式轉(zhuǎn)換(自動(dòng)轉(zhuǎn)換)
    //scala默認(rèn)情況下支持?jǐn)?shù)值類型的自動(dòng)轉(zhuǎn)換
    //Byte->Short->Int->Long
    //scala默認(rèn)情況下支持多態(tài)的自動(dòng)類型轉(zhuǎn)換
    //child->parent->trait(interface)

    //scala也支持自定義隱式轉(zhuǎn)換
    //將兩個(gè)無(wú)關(guān)的類型通過(guò)編程手段讓他們可以自動(dòng)轉(zhuǎn)換
    implicit def transform(d:Double): Int ={
      d.toInt
    }

    val i : Int = 5.0
    println(i)//5
  }
}
  • 隱式轉(zhuǎn)換(自動(dòng)轉(zhuǎn)換)
  • scala默認(rèn)情況下支持?jǐn)?shù)值類型的自動(dòng)轉(zhuǎn)換
    Byte->Short->Int->Long
  • scala默認(rèn)情況下支持多態(tài)的自動(dòng)類型轉(zhuǎn)換
    *child->parent->trait(interface)
  • scala也支持自定義隱式轉(zhuǎn)換
    將兩個(gè)無(wú)關(guān)的類型通過(guò)編程手段讓他們可以自動(dòng)轉(zhuǎn)換

2猜嘱、隱式轉(zhuǎn)換增強(qiáng)功能(在不改變?cè)写a的基礎(chǔ)上店读,增強(qiáng)功能)

object Scala01_implicit {
  def main(args: Array[String]): Unit = {
    
    implicit def transform(myslq:Mysql): Operater ={
      new Operater()
    }
    
    val mysql: Mysql = new Mysql()
    mysql.insert()
    mysql.delete() //因?yàn)殡[式轉(zhuǎn)換,mysql已經(jīng)是Operater類型峭弟,所以可以調(diào)用delete方法
  }
}

class Operater{
  def delete(): Unit ={
    println("刪除方法 ...")
  }

}

class Mysql{
  def insert(): Unit ={
    println("插入方法 ...")
  }
}

3附鸽、隱式值與隱式參數(shù)

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

    def test(name : String): Unit ={
      println("hello "+name)
    }

    def test1(name : String = "lisi"): Unit ={
      println("hello "+name)
    }

    implicit val username : String = "wangwu"

    def test2(implicit name : String = "lisi"): Unit ={
      println("hello "+name)
    }
    test("zhangsan") // hello zhangsan
    test1() //hello lisi 入?yún)⒅付四J(rèn)值時(shí),可以不寫(xiě)入?yún)⒙魅常欢ㄒ獙?xiě)()

    test2 // hello wangwu  使用隱式轉(zhuǎn)換,不要帶小括號(hào)
    test2() // hello lisi 方法調(diào)用時(shí)使用小括號(hào)坷备,會(huì)導(dǎo)致隱式轉(zhuǎn)換無(wú)法傳遞

  }
}

總結(jié):如果隱式參數(shù)存在默認(rèn)值、對(duì)應(yīng)參數(shù)的隱式值情臭,那么優(yōu)先采用隱士值省撑,如果找不到赌蔑,采用默認(rèn)值,再找不到竟秫,報(bào)錯(cuò)

4娃惯、隱式類

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

    val user5:User5 = new User5()

    user5.insert() // insert ...
    user5.detele() // detele ...
   }
  
  // 1、隱式類相當(dāng)于包裝類
  // 2鸿摇、有且只有一個(gè)參數(shù):需要報(bào)包裝的對(duì)象(值)
  implicit class Person5(u:User5){
    def detele(): Unit ={
      println("detele ...")
    }
  }
  class User5(){
    def insert(): Unit ={
      println("insert ...")
    }
  }
}

隱式類使用有如下幾個(gè)特點(diǎn):
1)其所帶的構(gòu)造參數(shù)有且只能有一個(gè)
2)隱式類必須被定義在“類”或“伴生對(duì)象”或“包對(duì)象”里石景,即隱式類不能是 頂級(jí)的(top-level objects)。
3)隱式類不能是case class(case class在后續(xù)介紹 樣例類)
4)作用域內(nèi)不能有與之相同名稱的標(biāo)識(shí)符

5拙吉、隱式轉(zhuǎn)換的解析機(jī)制(隱式轉(zhuǎn)換的搜索范圍)

編譯器是如何查找到缺失信息的潮孽,解析具有以下兩種規(guī)則:

  • 首先會(huì)在當(dāng)前代碼作用域下查找隱式實(shí)體(隱式方法、隱式類筷黔、隱式對(duì)象)往史。
  • 如果第一條規(guī)則查找隱式實(shí)體失敗,會(huì)繼續(xù)在隱式參數(shù)的類型的作用域里查找佛舱。類型的作用域是指與該類型相關(guān)聯(lián)的全部伴生模塊椎例,一個(gè)隱式實(shí)體的類型T它的查找范圍如下(第二種情況范圍廣且復(fù)雜在使用時(shí),應(yīng)當(dāng)盡量避免出現(xiàn)):
    a) 如果T被定義為T(mén) with A with B with C,那么A,B,C都是T的部分请祖,在T的隱式解析過(guò)程中订歪,它們的伴生對(duì)象都會(huì)被搜索。
    b) 如果T是參數(shù)化類型肆捕,那么類型參數(shù)和與類型參數(shù)相關(guān)聯(lián)的部分都算作T的部分刷晋,比如List[String]的隱式搜索會(huì)搜索List的伴生對(duì)象和String的伴生對(duì)象。
    c) 如果T是一個(gè)單例類型p.T慎陵,即T是屬于某個(gè)p對(duì)象內(nèi)眼虱,那么這個(gè)p對(duì)象也會(huì)被搜索。
    d) 如果T是個(gè)類型注入S#T席纽,那么S和T都會(huì)被搜索捏悬。
//解釋b項(xiàng)
object Scala06_implicit {
  def main(args: Array[String]): Unit = {

    val user6:Users6 = new Users6()

    user6.insert() // insert ...
    user6.detele() // detele ...
   }
  
  class Users6() extends Test6 {
    def insert(): Unit ={
      println("insert ...")
    }
  }
}

trait Test6{

}

object Test6{
  implicit class Person6(u:Users6){
    def detele(): Unit ={
      println("detele ...")
    }
  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市润梯,隨后出現(xiàn)的幾起案子过牙,更是在濱河造成了極大的恐慌,老刑警劉巖仆救,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抒和,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡彤蔽,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)庙洼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)顿痪,“玉大人镊辕,你說(shuō)我怎么就攤上這事∫舷” “怎么了征懈?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)揩悄。 經(jīng)常有香客問(wèn)我卖哎,道長(zhǎng),這世上最難降的妖魔是什么删性? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任亏娜,我火速辦了婚禮,結(jié)果婚禮上蹬挺,老公的妹妹穿的比我還像新娘维贺。我一直安慰自己,他們只是感情好巴帮,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布溯泣。 她就那樣靜靜地躺著,像睡著了一般榕茧。 火紅的嫁衣襯著肌膚如雪垃沦。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 50,084評(píng)論 1 291
  • 那天用押,我揣著相機(jī)與錄音肢簿,去河邊找鬼。 笑死只恨,一個(gè)胖子當(dāng)著我的面吹牛译仗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播官觅,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼纵菌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了休涤?” 一聲冷哼從身側(cè)響起咱圆,我...
    開(kāi)封第一講書(shū)人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎功氨,沒(méi)想到半個(gè)月后序苏,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡捷凄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年忱详,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片跺涤。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡匈睁,死狀恐怖监透,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情航唆,我是刑警寧澤胀蛮,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站糯钙,受9級(jí)特大地震影響粪狼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜任岸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一再榄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧演闭,春花似錦不跟、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至吕座,卻和暖如春虐译,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背吴趴。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工漆诽, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人锣枝。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓厢拭,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親撇叁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子供鸠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容