最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java Scala的隱式轉(zhuǎn)換詳解

 更新時(shí)間:2023年04月21日 09:56:04   作者:Java運(yùn)動(dòng)猿  
隱式轉(zhuǎn)換是在Scala編譯器進(jìn)行類型匹配時(shí),如果找不到合適的類型,那么隱式轉(zhuǎn)換會(huì)讓編譯器在作用范圍內(nèi)自動(dòng)推導(dǎo)出來合適的類型。本文通過代碼示例介紹了Scala的隱式轉(zhuǎn)換,感興趣的小伙伴可以參考閱讀

隱式轉(zhuǎn)換是在Scala編譯器進(jìn)行類型匹配時(shí),如果找不到合適的類型,那么隱式轉(zhuǎn)換會(huì)讓編譯器在作用范圍內(nèi)自動(dòng)推導(dǎo)出來合適的類型。

一、隱式值與隱式參數(shù)

隱式值是指在定義參數(shù)時(shí)前面加上implicit。隱式參數(shù)是指在定義方法時(shí),方法中的部分參數(shù)是由implicit修飾【必須使用柯里化的方式,將隱式參數(shù)寫在后面的括號(hào)中】。隱式轉(zhuǎn)換作用就是:當(dāng)調(diào)用方法時(shí),不必手動(dòng)傳入方法中的隱式參數(shù),Scala會(huì)自動(dòng)在作用域范圍內(nèi)尋找隱式值自動(dòng)傳入。

隱式值和隱式參數(shù)需要注意以下幾點(diǎn):
1.同類型的參數(shù)的隱式值只能在作用域內(nèi)出現(xiàn)一次,同一個(gè)作用域內(nèi)不能定義多個(gè)類型一樣的隱式值。

2.implicit關(guān)鍵字必須放在隱式參數(shù)定義的開頭

3.一個(gè)方法只有一個(gè)參數(shù)是隱式轉(zhuǎn)換參數(shù)時(shí),那么可以直接定義implicit關(guān)鍵字修飾的參數(shù),調(diào)用時(shí)直接創(chuàng)建類型不傳入?yún)?shù)即可。

4.一個(gè)方法如果有多個(gè)參數(shù),要實(shí)現(xiàn)部分參數(shù)的隱式轉(zhuǎn)換,必須使用柯里化這種方式,隱式關(guān)鍵字出現(xiàn)在后面,只能出現(xiàn)一次

package com.bjsxt.scala
 
 
object ImplicitValue {
  /**
   * 隱式值和隱式參數(shù)需要注意以下幾點(diǎn):
   * 1.同類型的參數(shù)的隱式值只能在作用域內(nèi)出現(xiàn)一次,同一個(gè)作用域內(nèi)不能定義多個(gè)類型一樣的隱式值。
   * 2.implicit關(guān)鍵字必須放在隱式參數(shù)定義的開頭
   * 3.一個(gè)方法只有一個(gè)參數(shù)是隱式轉(zhuǎn)換參數(shù)時(shí),那么可以直接定義implicit關(guān)鍵字修飾的參數(shù),調(diào)用時(shí)直接創(chuàng)建類型不傳入?yún)?shù)即可。
   * 4.一個(gè)方法如果有多個(gè)參數(shù),要實(shí)現(xiàn)部分參數(shù)的隱式轉(zhuǎn)換,必須使用柯里化這種方式,隱式關(guān)鍵字出現(xiàn)在后面,只能出現(xiàn)一次
   */
 
    //   * 4.一個(gè)方法如果有多個(gè)參數(shù),要實(shí)現(xiàn)部分參數(shù)的隱式轉(zhuǎn)換,
    //   必須使用柯里化這種方式,隱式關(guān)鍵字出現(xiàn)在后面,只能出現(xiàn)一次
  def Student(age:Int)(implicit name:String,i:Int) = {
    println(s"student = $name,age = $age,score = $i")
  }
  
  //   * 3.一個(gè)方法只有一個(gè)參數(shù)是隱式轉(zhuǎn)換參數(shù)時(shí),那么可以直接定義implicit關(guān)鍵字修飾的參數(shù),
  //   調(diào)用時(shí)直接創(chuàng)建類型不傳入?yún)?shù)即可。
  def Teacher(implicit name:String) = {
    println(s"teacher name is =$name")
  }
  def main(args: Array[String]): Unit = {
    //   * 1.同類型的參數(shù)的隱式值只能在作用域內(nèi)出現(xiàn)一次,
    //   同一個(gè)作用域內(nèi)不能定義多個(gè)類型一樣的隱式值。比如這里的String、Int類型,各自只能定義一個(gè)
    implicit val name:String = "zhangsan"
    implicit val i:Int = 100
 
    //這里使用了隱式參數(shù),只用傳入age那個(gè)參數(shù),后面兩個(gè)參數(shù)可以不填,默認(rèn)使用隱式值
    Student(100)
    //這里是直接使用了隱式值,可以不填參數(shù),當(dāng)然也可以給定參數(shù),給定參數(shù)的話就是取給的參數(shù)的值
    Teacher
  }
}

輸出的結(jié)果:會(huì)自動(dòng)尋找對應(yīng)的函數(shù),并且進(jìn)行隱式轉(zhuǎn)換。

student = zhangsan,age = 100,score = 100
teacher name is =zhangsan

二、隱式轉(zhuǎn)換函數(shù)

隱式轉(zhuǎn)換函數(shù)是使用關(guān)鍵字implicit修飾的方法。當(dāng)Scala運(yùn)行時(shí),假設(shè)如果A類型變量調(diào)用了method()這個(gè)方法,發(fā)現(xiàn)A類型的變量沒有method()方法,而B類型有此method()方法,會(huì)在作用域中尋找有沒有隱式轉(zhuǎn)換函數(shù)將A類型轉(zhuǎn)換成B類型,如果有隱式轉(zhuǎn)換函數(shù),那么A類型就可以調(diào)用method()這個(gè)方法。

隱式轉(zhuǎn)換函數(shù)注意:隱式轉(zhuǎn)換函數(shù)只與函數(shù)的參數(shù)類型和返回類型有關(guān),與函數(shù)名稱無關(guān),所以作用域內(nèi)不能有相同的參數(shù)類型和返回類型的不同名稱隱式轉(zhuǎn)換函數(shù)。

package com.bjsxt.scala
 
class Animal(name:String){
  def canFly()= {
    println(s"$name can fly....")
  }
}
 
class Rabbit(xname:String){
  val name = xname
}
 
object ImplicitValue2 {
  
  //定義隱式轉(zhuǎn)換函數(shù)
  implicit def RabbitToAnimal(r:Rabbit):Animal = {
    new Animal(r.name)
  }
  //注意隱式轉(zhuǎn)換函數(shù)只與參數(shù)類型和返回值類型有關(guān),
  // 與函數(shù)名無關(guān),所以不能定義兩個(gè)相同類型的函數(shù),雖然函數(shù)名不同,下面這個(gè)就是非法的
//  implicit def Rabbit(r:Rabbit):Animal = {
//    new Animal(r.name)
//  }
 
  def main(args: Array[String]): Unit = {
    val rabbit = new Rabbit("rabbit")
    //這里rabbit調(diào)用不了canFly,因?yàn)镽abbit類中沒有canFly方法,
    // 但定義了隱式轉(zhuǎn)換函數(shù),那就會(huì)往Animal類中找
    rabbit.canFly()
  }
}

運(yùn)行結(jié)果:

rabbit can fly....

三、隱式類

使用implicit關(guān)鍵字修飾的類就是隱式類。若一個(gè)變量A沒有某些方法或者某些變量時(shí),而這個(gè)變量A可以調(diào)用某些方法或者某些變量時(shí),可以定義一個(gè)隱式類,隱式類中定義這些方法或者變量,隱式類中傳入A即可。

隱式類注意:

1.隱式類必須定義在類,包對象,伴生對象中

2.隱式類的構(gòu)造必須只有一個(gè)參數(shù),同一個(gè)類,包對象,伴生對象中不能出現(xiàn)同類型構(gòu)造的隱式類。

package com.bjsxt.scala
//隱式類
 
class Rabbit1(xname:String){
  val name = xname
}
 
object ImplicitValue3 {
 
  //定義隱式類,只能在object中定義,并且只能傳入一個(gè)參數(shù)
  //不能出現(xiàn)同類型構(gòu)造的隱式類。(同類型:參數(shù)類型和返回值類型,與類名無關(guān))
  implicit class Animal1(r:Rabbit1){
    def showName() = {
      println(s"${r.name} is Rabbit....")//對象.屬性需要加“{}”
    }
  }
 
  def main(args: Array[String]): Unit = {
    val rabbit = new Rabbit1("RABBIT")
//    Rabbit1類中沒有showName方法,這是會(huì)找隱式類
    rabbit.showName()
  }
 
}

運(yùn)行結(jié)果:

RABBIT is Rabbit....

到此這篇關(guān)于Java Scala的隱式轉(zhuǎn)換詳解的文章就介紹到這了,更多相關(guān)Scala隱式轉(zhuǎn)換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用JavaMail發(fā)送郵件保證成功的方法

    使用JavaMail發(fā)送郵件保證成功的方法

    JavaMail是利用現(xiàn)有的郵件賬戶發(fā)送郵件的工具,使用過JavaMail的api發(fā)送郵件的人可能會(huì)有這樣一個(gè)疑惑:我如何知道我調(diào)用該api發(fā)送的郵件是否成功呢?那么通過下面這篇文章大家一起來看看使用JavaMail保證郵件發(fā)送成功的方法,有需要的朋友們可以參考借鑒。
    2016-11-11
  • @TransactionalEventListener的使用和實(shí)現(xiàn)原理分析

    @TransactionalEventListener的使用和實(shí)現(xiàn)原理分析

    這篇文章主要介紹了@TransactionalEventListener的使用和實(shí)現(xiàn)原理分析,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • SpringBoot中HTTP請求不通的原因級(jí)解決方法

    SpringBoot中HTTP請求不通的原因級(jí)解決方法

    HTTP 請求是指從客戶端到服務(wù)器的請求消息,對于一個(gè) Spring Boot 項(xiàng)目而言,服務(wù)器就是 Spring Boot,客戶端就是用戶本地的瀏覽器,但是會(huì)遇到SpringBoot HTTP請求不通的問題,本文介紹了一些常見問題及解決方法,需要的朋友可以參考下
    2025-02-02
  • Apache commons fileupload文件上傳實(shí)例講解

    Apache commons fileupload文件上傳實(shí)例講解

    這篇文章主要為大家詳細(xì)介紹了Apache commons fileupload文件上傳實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • @Transactional注解不起作用的原因分析及解決

    @Transactional注解不起作用的原因分析及解決

    這篇文章主要介紹了@Transactional注解不起作用的原因分析及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • spring boot + mybatis實(shí)現(xiàn)動(dòng)態(tài)切換數(shù)據(jù)源實(shí)例代碼

    spring boot + mybatis實(shí)現(xiàn)動(dòng)態(tài)切換數(shù)據(jù)源實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于spring boot + mybatis實(shí)現(xiàn)動(dòng)態(tài)切換數(shù)據(jù)源的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-10-10
  • androidQ sd卡權(quán)限使用詳解

    androidQ sd卡權(quán)限使用詳解

    這篇文章主要介紹了androidQ sd卡權(quán)限使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • 新手初學(xué)Java數(shù)組

    新手初學(xué)Java數(shù)組

    數(shù)組是相同類型數(shù)據(jù)的有序集合數(shù)組描述的是相同類型的若干個(gè)數(shù)據(jù),按照一定的先后次序排列組合而成。其中,每一個(gè)數(shù)據(jù)稱作一個(gè)數(shù)組元素,每個(gè)數(shù)組元素可以通過一個(gè)下標(biāo)來訪問它們數(shù)組的聲明創(chuàng)建
    2021-07-07
  • Java中==與equals()及hashcode()三者之間的關(guān)系詳解

    Java中==與equals()及hashcode()三者之間的關(guān)系詳解

    最近也是在讀Hollis的《深入理解Java核心技術(shù)》里面一節(jié)講到了equals()和hashcode()的關(guān)系,對于這個(gè)高頻面試點(diǎn),咱們需要認(rèn)真理清一下幾者之間的關(guān)系
    2022-10-10
  • Java封裝數(shù)組實(shí)現(xiàn)在數(shù)組中查詢元素和修改元素操作示例

    Java封裝數(shù)組實(shí)現(xiàn)在數(shù)組中查詢元素和修改元素操作示例

    這篇文章主要介紹了Java封裝數(shù)組實(shí)現(xiàn)在數(shù)組中查詢元素和修改元素操作,結(jié)合實(shí)例形式分析了java針對數(shù)組元素查詢、修改的封裝操作實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2020-03-03

最新評論

鄱阳县| 泽州县| 天镇县| 吉安县| 泊头市| 伊金霍洛旗| 荔波县| 屏东市| 九龙县| 日照市| 伊川县| 英山县| 屯昌县| 石阡县| 宣城市| 仲巴县| 湘西| 东乡族自治县| 安化县| 巨野县| 庄河市| 临高县| 白沙| 连平县| 桂东县| 平罗县| 通渭县| 嘉鱼县| 曲靖市| 任丘市| 奉贤区| 临沭县| 新兴县| 郁南县| 汉源县| 鄯善县| 潞城市| 肥乡县| 会昌县| 宣城市| 珲春市|