第 9 章 隱式轉換和隱式值

2021-10-03 23:23:55 字數 4925 閱讀 8262

1、隱式函式基本介紹

隱式轉換函式是以implicit關鍵字宣告的帶有單個引數的函式。這種函式將會自動應用,將值從

一種型別轉換為另一種型別。

隱式函式快速入門

使用隱式函式可以優雅的解決資料型別轉換。
示例**:

package com.lj.scala.implicitly

/** * @author administrator

* @create 2020-03-12

*/object implicittest01

val num: int =

4.56

println

("num="

+ num)

// num=4

}}

隱式轉換的注意事項和細節

1. 隱式轉換函式的函式名可以是任意的,隱式轉換與函式名稱無關,只與函式簽名(函式引數型別

和返回值型別)有關;

2. 隱式函式可以有多個(即:隱式函式列表),但是需要保證在當前環境下,只有乙個隱式函式能被識別

//在當前環境中,不能存在滿足條件的多個隱式函式

implicit def a(d: double) = d.toint

implicit def b(d: double) = d.toint

val i1: int = 3.5 //(x)在轉換時,識別出有兩個方法可以被使用,就不確定呼叫哪乙個,所以出錯

println(i1)

基本介紹

如果需要為乙個類增加乙個方法,可以通過隱式轉換來實現(動態增加功能),比如想為mysql

類增加乙個delete方法;

分析解決方案

在當前程式中,如果想要給mysql類增加功能是非常簡單的,但是在實際專案中,如果想要增

加新的功能就會需要改變源**,這是很難接受的。而且違背了軟體開發的ocp開發原則 (閉合原

則 open close priceple) ,在這種情況下,可以通過隱式轉換函式給類動態新增功能。

示例**:

package com.lj.scala.implicitly

/** * @author administrator

* @create 2020-03-12

*/object implicittest02

// 此時computer類就可以通過隱士函式呼叫chat()方法

computer.

chat

("computer")}

}class

computer

}class

phone

def chat

(name: string)

: unit =}==

====

====

====

====

===執行結果==

====

====

====

====

====

====

====

=computer可以用來上網學習程式設計!

computer可以用來上網聊天!

====

====

====

====

====

=執行結果==

====

====

====

====

====

====

====

=

基本介紹

隱式值也叫隱式變數,將某個形參變數標記為implicit,所以編譯器會在方法省略隱式引數的

情況下去搜尋作用域內的隱式值作為預設引數。

示例**【包括隱式值、隱式引數預設值、傳值之間的優選級】:

package com.lj.scala.implicitly

/** * @author administrator

* @create 2020-03-12

*/object implicittest03

def sayhello

(implicit name: string)

: unit =

def play

(implicit name: string =

"leo"

): unit =

def getinfo

(implicit age: int)

: unit =

}

基本介紹

在scala2.10後提供了隱式類,可以使用implicit宣告類,隱式類的非常強大,同樣可以擴充套件類

的功能,比前面使用隱式轉換豐富類庫功能更加的方便,在集合中隱式類會發揮重要的作用。

隱式類使用有如下幾個特點

1. 其所帶的構造引數有且只能有乙個;

2. 隱式類必須被定義在「類」或「伴生物件」或「包物件」裡,即隱式類不能是 頂級的(top-level objects);

3. 隱式類不能是case class;

4. 作用域內不能有與之相同名稱的識別符號。

示例**:

package com.lj.scala.implicitly

/** * @author administrator

* @create 2020-03-12

*/object implicittest04

/** * 此時的addfunction會對應生成隱式類,當我們在作用域內建立cat物件的時候

* 該隱式類就會生效,這個工作是編譯器來完成的。

** 隱式轉換的時機:

* 1. 當方法中的引數的型別與目標型別不一致時,會在作用域內呼叫隱式轉換;

* 2. 當物件呼叫所在類中不存在的方法或成員時,編譯器會自動將物件進行隱式轉換(根據型別)。

*/implicit class

addfunction

(val cat: cat)

def addage

(age: int)

: unit =}}

class

dog}

class

cat def addage

(name: string)

: unit =}==

====

====

====

====

===執行結果==

====

====

====

====

====

====

====

=貓會抓老鼠!

這只花貓的名字叫:咖啡

這只咖啡貓今年3歲了!

toney貓特別懶,今年2歲了!

====

====

====

====

====

=執行結果==

====

====

====

====

====

====

====

=

1、隱式解析機制

即編譯器是如何查詢到缺失資訊的,解析具有以下兩種規則

1. 首先會在當前**作用域下查詢隱式實體(隱式方法、隱式類、隱式物件),大多數都是這種

情況。2. 如果第一條規則查詢隱式實體失敗,會繼續在隱式引數的型別的作用域裡查詢。型別的作用域

是指與該型別相關聯的全部伴生模組,乙個隱式實體的型別「t」它的查詢範圍如下

(第二種情況範圍廣且複雜,在使用時應當盡量避免出現):

a) 如果「t」被定義為「t with a with b with c」,那麼a,b,c都是「t」的部分,在「t」的隱式解析過程中,

它們的伴生物件都會被搜尋。

b) 如果「t」是引數化型別,那麼型別引數和與型別引數相關聯的部分都算作「t」的部分,比如

「list[string]」的隱式搜尋會搜「list」的伴生物件和「string」的伴生物件。

c) 如果「t」是乙個單例型別p.t,即「t」是屬於某個「p」物件內,那麼這個「p」物件也會被搜尋。

d) 如果「t」是個型別注入s#t,那麼「s」和「t」都會被搜尋。

2、隱式轉換的前提

在進行隱式轉換時,需要遵守兩個基本的前提

不能存在二義性

隱式操作不能巢狀使用 // 如:隱式轉換函式

示例**:

package com.lj.scala.implicitly

/** * @author administrator

* @create 2020-03-12

*/object implicittest01

val num: int =

4.56

println

("num="

+ num)

// num=4

}}

對以前的知識回顧,加深基礎知識!

學習來自:北京尚矽谷韓順平老師—尚矽谷大資料技術之scala

每天進步一點點,也許某一天你也會變得那麼渺小!!!

隱式轉換和隱式引數

1 隱式轉換 隱式轉換函式是以implicit關鍵字宣告的帶有單個引數的函式。這種函式將會自動應用,將值從一種型別轉換為另一種型別 object scala01 implicit def f1 d double int double 是輸入型別,int 是轉換後的型別 隱式函式的底層工作原理 def...

Scala 基礎11 隱式轉換和隱式值

1 隱式函式 隱式轉換函式是以implicit關鍵字宣告的帶有單個引數的函式。這種函式將會自動應用,將值從一種型別轉換為另一種型別 object scala01 使用隱式函式可以優雅的解決資料型別轉換 implicit def f1 d double int double 是輸入型別,int 是轉換...

09 Scala 隱式轉換和隱式值

2.隱式轉換豐富類庫功能 3.隱式值 4.隱式類 5.隱式轉換時機 隱式轉換函式是以implicit關鍵字宣告的帶有單個引數的函式。這種函式會自動應用,將值從一種型別轉換為另一種型別。object implicitdemo01 val num int 3.5 底層編譯 f1 1 3.5 printl...