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...