溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java?Scala的隱式轉(zhuǎn)換怎么使用

發(fā)布時間:2023-05-06 10:03:07 來源:億速云 閱讀:175 作者:zzz 欄目:開發(fā)技術(shù)

本文小編為大家詳細(xì)介紹“Java Scala的隱式轉(zhuǎn)換怎么使用”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“Java Scala的隱式轉(zhuǎn)換怎么使用”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識吧。

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

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

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

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

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

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

4.一個方法如果有多個參數(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)一次,同一個作用域內(nèi)不能定義多個類型一樣的隱式值。
   * 2.implicit關(guān)鍵字必須放在隱式參數(shù)定義的開頭
   * 3.一個方法只有一個參數(shù)是隱式轉(zhuǎn)換參數(shù)時,那么可以直接定義implicit關(guān)鍵字修飾的參數(shù),調(diào)用時直接創(chuàng)建類型不傳入?yún)?shù)即可。
   * 4.一個方法如果有多個參數(shù),要實(shí)現(xiàn)部分參數(shù)的隱式轉(zhuǎn)換,必須使用柯里化這種方式,隱式關(guān)鍵字出現(xiàn)在后面,只能出現(xiàn)一次
   */
 
    //   * 4.一個方法如果有多個參數(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.一個方法只有一個參數(shù)是隱式轉(zhuǎn)換參數(shù)時,那么可以直接定義implicit關(guān)鍵字修飾的參數(shù),
  //   調(diào)用時直接創(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)一次,
    //   同一個作用域內(nèi)不能定義多個類型一樣的隱式值。比如這里的String、Int類型,各自只能定義一個
    implicit val name:String = "zhangsan"
    implicit val i:Int = 100
 
    //這里使用了隱式參數(shù),只用傳入age那個參數(shù),后面兩個參數(shù)可以不填,默認(rèn)使用隱式值
    Student(100)
    //這里是直接使用了隱式值,可以不填參數(shù),當(dāng)然也可以給定參數(shù),給定參數(shù)的話就是取給的參數(shù)的值
    Teacher
  }
}

輸出的結(jié)果:會自動尋找對應(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è)如果A類型變量調(diào)用了method()這個方法,發(fā)現(xiàn)A類型的變量沒有method()方法,而B類型有此method()方法,會在作用域中尋找有沒有隱式轉(zhuǎn)換函數(shù)將A類型轉(zhuǎn)換成B類型,如果有隱式轉(zhuǎn)換函數(shù),那么A類型就可以調(diào)用method()這個方法。

隱式轉(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),所以不能定義兩個相同類型的函數(shù),雖然函數(shù)名不同,下面這個就是非法的
//  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ù),那就會往Animal類中找
    rabbit.canFly()
  }
}

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

rabbit can fly....

三、隱式類

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

隱式類注意:

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

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

package com.bjsxt.scala
//隱式類
 
class Rabbit1(xname:String){
  val name = xname
}
 
object ImplicitValue3 {
 
  //定義隱式類,只能在object中定義,并且只能傳入一個參數(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方法,這是會找隱式類
    rabbit.showName()
  }
 
}

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

RABBIT is Rabbit....

讀到這里,這篇“Java Scala的隱式轉(zhuǎn)換怎么使用”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點(diǎn)還需要大家自己動手實(shí)踐使用過才能領(lǐng)會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI