欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

scala中的隱式類型轉(zhuǎn)換的實現(xiàn)

 更新時間:2019年06月16日 15:17:30   作者:MatrixC  
這篇文章主要介紹了scala中的隱式類型轉(zhuǎn)換的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

Scala語言中的隱式轉(zhuǎn)換是一個十分強大的語言特性,主要可以起到兩個作用:

一.自動進行某些數(shù)據(jù)類型的隱式轉(zhuǎn)換

String類型是不能自動轉(zhuǎn)換為Int類型的,所以當(dāng)給一個Int類型的變量或常量賦予String類型的值時編譯器將報錯。所以,一下語句是錯誤的。

val x: Int = "100"

如果需要將一個字符串類型的整形數(shù)值賦給Int,比如使用String.toInt方法,例如:

val x: Int = "100".toInt

如果想讓字符串自動轉(zhuǎn)換為整形,就可以使用隱式轉(zhuǎn)換??梢远x如下函數(shù)。

implicit def strToInt(str: String) = str.toInt

這時你再對Int類型的變量賦值字符串時,字符串就會自動轉(zhuǎn)換為Int。

scala> val x:Int = "00"
x: Int = 100

如果你此時定義一個兩數(shù)相加的函數(shù)

def add(x: Int, y: Int) = x + y

就可以達到這種效果:

scala> add("100", 200)
res1: Int = 300

隱式轉(zhuǎn)換有一定的使用規(guī)則,比較重要的有2個。

1.按照《Scala編程》這本書中所說:插入的隱式轉(zhuǎn)換必須以單一標(biāo)識符的形式處于作用域中,或與轉(zhuǎn)換的源或目標(biāo)類型關(guān)聯(lián)在一起。Scala編譯器將僅考慮處于作用域之內(nèi)的隱式轉(zhuǎn)換。

簡而言之,就是在使用隱式轉(zhuǎn)換之前,需要用import把隱式轉(zhuǎn)換引用到當(dāng)前的作用域里或者就在作用域里定義隱式轉(zhuǎn)換。除了隱式轉(zhuǎn)換被引入進當(dāng)前作用域之外,還有一種方式可以使用隱式轉(zhuǎn)換,就是編譯器會在源類型或者期望的伴生對象中尋找隱式定義。

2.無歧義規(guī)則:隱式轉(zhuǎn)換只能在無其他可用轉(zhuǎn)換的前提下才能操作。如果在同一作用域里,對同一源類型定義一個以上的隱式轉(zhuǎn)換函數(shù),如果多種隱式轉(zhuǎn)換函數(shù)都可以匹配,那么編譯器將報錯,所以在使用時請移除不必要的隱式定義。

二.隱式參數(shù)

柯里化函數(shù)會有多個參數(shù)列表,當(dāng)希望對某個參數(shù)列表采用默認(rèn)參數(shù)時,可以使用implicit提供的隱式參數(shù)功能。做法是在需要自動填充的參數(shù)列表最開端加上implicit,然后在定義域內(nèi)定義需要填充的默認(rèn)參數(shù)值常量,并在常量的定義之前聲明implicit。

視界

當(dāng)有如下定義時

class Container[A <% Int] { def addIt(x: A) = 123 + x }

表示A類型必須可視為Int。簡單的說,就是需要有一個轉(zhuǎn)換函數(shù),可以自動的將A類型,轉(zhuǎn)換為Int類型,如果沒有這樣的轉(zhuǎn)換函數(shù),可以使用implicit定義。

寫一個類測試一下Scala中的隱式轉(zhuǎn)換的用法:

class Fraction(n: Int, d: Int) {
// def den = d
 private val den = d;
// def num = n 類參數(shù)定義為方法或字段都可以
 private val num = n;

// 定義乘法
 def *(other: Fraction) = Fraction(other.num * this.num, other.den * this.den)
// 重寫toString
 override def toString() = s"$num / $den" 
}
//伴生對象
object Fraction {
// implicit隱轉(zhuǎn) 方法名無關(guān)可以隨意改,自動調(diào)用
 implicit def int2Fraction(n: Int) = Fraction(n, 1)

 def apply(n: Int, d: Int) = {
  new Fraction(n, d)
 }

 def unapply(frac: Fraction) = if (frac.den == 0) None else Some((frac.num, frac.den))
}

object TestFrac extends App{
// 3 隱式調(diào)用了int2Fraction方法被轉(zhuǎn)化為一個Fraction對象Fraction(3,1)

 val result = 3 * Fraction(4,5)
// 也可以顯示調(diào)用
 val result2 = Fraction.int2Fraction(5) * Fraction(3,4)
 println(result)
// unapply
 val Fraction(num,den) = result
 println(num,den)

}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 一文帶你吃透JSP增刪改查實戰(zhàn)案例詳細(xì)解讀

    一文帶你吃透JSP增刪改查實戰(zhàn)案例詳細(xì)解讀

    這篇文章主要為大家詳細(xì)介紹了JSP中增刪改查實戰(zhàn)案例的相關(guān)知識,文中的示例代碼講解現(xiàn)象,具有一定的借鑒價值,感興趣的小伙伴可以了解一下
    2023-03-03
  • Java中的SkyWalking監(jiān)控告警詳解

    Java中的SkyWalking監(jiān)控告警詳解

    這篇文章主要介紹了Java中的SkyWalking監(jiān)控告警詳解,SkyWalking在6.x版本中新增了告警功能,其核心在于config/alarm-settings.yaml文件中,該文件分為rules和webhooks兩部分,需要的朋友可以參考下
    2023-11-11
  • Java Files和Paths的使用demo詳解

    Java Files和Paths的使用demo詳解

    Java Files和Paths是Java 7中引入的新API,用于處理文件和目錄,F(xiàn)iles類提供了許多有用的靜態(tài)方法來操作文件和目錄,而Path類則表示文件系統(tǒng)中的路徑,這篇文章主要介紹了Java Files和Paths的使用詳解,需要的朋友可以參考下
    2023-03-03
  • 舉例講解Java編程中this關(guān)鍵字與super關(guān)鍵字的用法

    舉例講解Java編程中this關(guān)鍵字與super關(guān)鍵字的用法

    這篇文章主要介紹了Java編程中this關(guān)鍵字與super關(guān)鍵字的用法示例,super是this的父輩,在繼承過程中兩個關(guān)鍵字經(jīng)常被用到,需要的朋友可以參考下
    2016-03-03
  • 最新評論