最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

你還不懂scala中的隱式轉(zhuǎn)換,一文帶你讀懂

2023-09-24 12:10 作者:滌生大數(shù)據(jù)  | 我要投稿

1.隱式轉(zhuǎn)換的概念

隱式轉(zhuǎn)換是將A轉(zhuǎn)換成B,但并不是A真的就成了B,而是A本來(lái)的屬性仍存在的同時(shí)又擁有了B的屬性,這使得了A本身不發(fā)生變化的同時(shí),擴(kuò)大了功能,此屬于蒙面設(shè)計(jì)模式。又因?yàn)锳直接使用了B的功能而不需要對(duì)A進(jìn)行修改,因此此轉(zhuǎn)換是隱式的,使用implicit修飾。所以簡(jiǎn)單的說(shuō)隱式轉(zhuǎn)換就是增強(qiáng)類型,擴(kuò)展功能。

2.隱式轉(zhuǎn)換適用情況

隱含轉(zhuǎn)換適用于兩種情況:

1)、如果表達(dá)式e是類型S,并且S不符合表達(dá)式的期望類型T

2)、在具有類型S的e的e.m表達(dá)中,如果m不表示S的成員

在第一種情況下,搜索適用于e并且其結(jié)果類型符合T的轉(zhuǎn)換c。在第二種情況下,搜索適用于e的轉(zhuǎn)換c,其結(jié)果包含名為m的成員。

3.隱式轉(zhuǎn)換的原理

當(dāng)編譯器第一次編譯失敗的時(shí)候,會(huì)在當(dāng)前的環(huán)境中查找能讓代碼編譯通過(guò)的方法,用于將類型進(jìn)行轉(zhuǎn)換,實(shí)現(xiàn)二次編譯。

當(dāng)想調(diào)用對(duì)象功能時(shí),如果編譯錯(cuò)誤,那么編譯器會(huì)嘗試在當(dāng)前作用域范圍內(nèi)查找能調(diào)用對(duì)應(yīng)功能的轉(zhuǎn)換規(guī)則,這個(gè)調(diào)用過(guò)程是由編譯器完成的,所以稱之為隱式轉(zhuǎn)換,或稱之為自動(dòng)轉(zhuǎn)換。

因?yàn)殡[式轉(zhuǎn)換可能有缺陷,如果不加區(qū)別地使用,編譯器在編譯隱式轉(zhuǎn)換定義時(shí)會(huì)發(fā)出警告。若要關(guān)閉警告,請(qǐng)采取以下任何一種操作:

1)將scala.language.implicitConversions導(dǎo)入隱式轉(zhuǎn)換定義的范圍

2)調(diào)用編譯器時(shí),加上:-language:implicitConversions

當(dāng)編譯器應(yīng)用轉(zhuǎn)換時(shí),不會(huì)發(fā)出警告。

因此,隱式解析機(jī)制總結(jié)如下:

(1)首先會(huì)在當(dāng)前代碼作用域下查找隱式實(shí)體(隱式方法、隱式類、隱式對(duì)象)。(一般是這種情況)

(2)如果第一條規(guī)則查找隱式實(shí)體失敗,會(huì)繼續(xù)在隱式參數(shù)的類型的作用域里查找。類型的作用域是指與該類型相關(guān)聯(lián)的全部伴生對(duì)象以及該類型所在包的包對(duì)象。

4.隱式轉(zhuǎn)換的作用域

隱式轉(zhuǎn)換作用域的概念,scala編譯器僅考慮作用域之內(nèi)的隱式轉(zhuǎn)換,要使用某種隱式操作,必須以單一標(biāo)識(shí)符的形式(一種情況例外)將其帶入作用域之內(nèi)。例如:

單一標(biāo)識(shí)符有一個(gè)例外,編譯器還將在源類型和目標(biāo)類型的伴生對(duì)象中尋找隱式定義。

5.隱式轉(zhuǎn)換的若干規(guī)則

1.顯示定義規(guī)則

在使用帶有隱式參數(shù)的函數(shù)時(shí),如果沒(méi)有明確指定與參數(shù)類型匹配相同的隱式值,編譯器不會(huì)通過(guò)額外的隱式轉(zhuǎn)換來(lái)確定函數(shù)的要求。

2.作用于規(guī)則

不管是隱式值,隱式對(duì)象,隱式類或隱式轉(zhuǎn)換函數(shù),都必須在當(dāng)前的作用域使用才能起作用。

3.無(wú)歧義規(guī)則

所謂無(wú)歧義指的是,不能存在多個(gè)隱式轉(zhuǎn)換使代碼合法,如代碼中不應(yīng)該存在兩個(gè)隱式轉(zhuǎn)換函數(shù)能夠同時(shí)使某一類型轉(zhuǎn)換為另一類型,也不應(yīng)該存在相同的兩個(gè)隱式值,主構(gòu)造函數(shù)參數(shù)類型以及成員方法等同的兩個(gè)隱式類。

4.一次性轉(zhuǎn)換規(guī)則

隱式轉(zhuǎn)換從源類型到目標(biāo)類型只會(huì)經(jīng)過(guò)一次轉(zhuǎn)換,不會(huì)經(jīng)過(guò)多次隱式轉(zhuǎn)換達(dá)到。

6.常見(jiàn)的隱式轉(zhuǎn)換類型

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

1.格式

2.例子

流程大概是這樣的:new File().read-->發(fā)現(xiàn)File類中沒(méi)有read方法-->然后找隱式轉(zhuǎn)換,找到某個(gè)方法的參數(shù)正好File類型,然后便執(zhí)行這個(gè)隱式函數(shù),得到RichFile類型,該類型中read方法,便繼續(xù)執(zhí)行即可,否則運(yùn)行不通過(guò)。再例如:

3.注意事項(xiàng)

1) 隱式轉(zhuǎn)換函數(shù)的函數(shù)名可以是任意的,與函數(shù)名稱無(wú)關(guān),只與函數(shù)簽名(函數(shù)參數(shù)和返回值類型)有關(guān),即隱式函數(shù)的入?yún)⒁蔷幾g不通過(guò)的類型,返回值要是能正確編譯的類型。

2)如果當(dāng)前作用域中存在函數(shù)簽名相同但函數(shù)名稱不同的兩個(gè)隱式轉(zhuǎn)換函數(shù),則在進(jìn)行隱式轉(zhuǎn)換時(shí)會(huì)報(bào)錯(cuò)。

6.2 隱式類

在 Scala2.10 后提供了隱式類,可以使用 implicit 聲明類,隱式類的非常強(qiáng)大,同樣可以擴(kuò)展類的功能,在集合中隱式類會(huì)發(fā)揮重要的作用。

1.格式

2.例子

string中沒(méi)有bark方法,通過(guò)隱式轉(zhuǎn)換,調(diào)用對(duì)應(yīng)的方法轉(zhuǎn)換。

再比如

    3.注意事項(xiàng)

    隱式類的運(yùn)作方式是:隱式類的主構(gòu)造函數(shù)只能有一個(gè)參數(shù)(有兩個(gè)以上并不會(huì)報(bào)錯(cuò),但是這個(gè)隱式類永遠(yuǎn)不會(huì)被編譯器作為隱式類在隱式轉(zhuǎn)化中使用),且這個(gè)參數(shù)的類型就是將要被轉(zhuǎn)換的目標(biāo)類型。從語(yǔ)義上這很自然:這個(gè)隱式轉(zhuǎn)換類將包裹目標(biāo)類型,隱式類的所有方法都會(huì)自動(dòng)“附加”到目標(biāo)類型上。所以:

    1)隱式類的主構(gòu)造函數(shù)參數(shù)有且僅有一個(gè)!之所以只能有一個(gè)參數(shù),是因?yàn)殡[式轉(zhuǎn)換是將一種類型轉(zhuǎn)換為另外一種類型,源類型與目標(biāo)類型是一一對(duì)應(yīng)的;

    2)implicit修飾符修飾類時(shí)只能存在于“類”或“伴生對(duì)象”或“包對(duì)象”或“特質(zhì)”之內(nèi),即隱式類不能是頂級(jí)的;

    3)在同一作用域內(nèi),不能有任何方法、成員或?qū)ο笈c隱式類同名;

    4)隱式類不能是case class;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

    5)Scala源碼中存在的大部分隱式轉(zhuǎn)換都是存在于Predef之中,比如:String->StringOps,Array->ArrayOps等,而Scala.Predef 自動(dòng)引入到當(dāng)前作用域。

    6.3 隱式對(duì)象

    1.格式

    2.例子

    3.注意事項(xiàng)

    1)def multiply[T: Multiplicable](x: T): T = { ?//等價(jià)于def multiply[T](x:T)(implicit mc:Multiplicable[T]):T={而T: Multiplicable就是所謂的Context Bounds,類型參數(shù)聲明 T : Comparator 就表示存在一個(gè) Comparator[T]類型的隱式值。

    2)def implicitly[T](implicit e: T) = e ? 是Predef中的方法,用于返回隱式對(duì)象。編譯器會(huì)記錄當(dāng)前上下文里的隱式值,而該方法則可以獲得某種類型的隱式值。

    3)implicit修飾符修飾對(duì)象時(shí)不能處于頂層對(duì)象級(jí)別。

    6.4 隱式參數(shù)

    1.格式

    2.例子

    3.隱式參數(shù)使用的常見(jiàn)問(wèn)題

    非柯里化:

    1)當(dāng)函數(shù)沒(méi)有柯里化時(shí),implicit關(guān)鍵字會(huì)作用于函數(shù)列表中的的所有參數(shù)。? ? ? ?

    2)隱式參數(shù)使用時(shí)要么全部不指定,要么全部指定,不能只指定部分。

    3)在指定隱式參數(shù)時(shí),implicit 關(guān)鍵字只能出現(xiàn)在參數(shù)開(kāi)頭。

    柯里化:????

    4)如果想要實(shí)現(xiàn)參數(shù)的部分隱式參數(shù),只能使用函數(shù)的柯里化,例如:要實(shí)現(xiàn)這種形式的函數(shù),def test(x:Int, implicit ?y: Double)的形式,必須使用柯里化實(shí)現(xiàn):def test(x: Int)(implicit y: Double);

    5) 柯里化的函數(shù), implicit 關(guān)鍵字只能作用于最后一個(gè)參數(shù)。否則,不合法;

    6)implicit 關(guān)鍵字在隱式參數(shù)中只能出現(xiàn)一次,柯里化的函數(shù)也不例外!

    7)匿名函數(shù)不能使用隱式參數(shù)。如:val prodeuct = (implicit x: Double, y: Double) => x*y ?會(huì)報(bào)錯(cuò);

    8)柯里化的函數(shù)如果有隱式參數(shù),則不能使用其偏函數(shù)?。

    6.5 隱式值

    1.格式

    2.例子

    3.注意事項(xiàng)

    1)同類型的隱式值只能在作用域內(nèi)出現(xiàn)一次,即不能在同一個(gè)作用域中定義多個(gè)相同類型的隱式值。但是不同類型的可以出現(xiàn)多次。

    2)編譯器按照隱式參數(shù)的類型去尋找對(duì)應(yīng)類型的隱式值,與隱式值的名稱無(wú)關(guān)。

    3)implicitly[T]可以檢索作用域內(nèi)的類型為T(mén)的隱式值:

    你還不懂scala中的隱式轉(zhuǎn)換,一文帶你讀懂的評(píng)論 (共 條)

    分享到微博請(qǐng)遵守國(guó)家法律
    嵩明县| 离岛区| 微山县| 普兰店市| 瑞昌市| 成安县| 长海县| 长汀县| 阆中市| 苍梧县| 信宜市| 彰化市| 五原县| 万全县| 民权县| 东辽县| 唐山市| 阿鲁科尔沁旗| 盐亭县| 洞头县| 新源县| 渭南市| 清水县| 漳州市| 淅川县| 措美县| 平江县| 华安县| 孝感市| 徐水县| 三江| 宜君县| 大石桥市| 交城县| 杂多县| 河南省| 彰化县| 柘城县| 九龙坡区| 阿克陶县| 阿合奇县|