目錄
隱式轉換的概念
隱式轉換的使用
隱式轉換做引數型別轉換
隱式轉換增強現有型別
隱式引數
利用隱式引數進行隱式轉換
再議context bounds
隱式轉換函式(implicit conversion function)是以implicit關鍵字宣告的帶有單個引數的函式,這樣的函式將被自動應用,將值從一種型別轉換為另一種型別。隱式轉換函式叫什麼名字是無所謂的,因為通常不會由使用者手動呼叫,而是由scala進行呼叫。但是如果要使用隱式轉換,則需要對隱式轉換函式進行匯入。因此通常建議將隱式轉換函式的名稱命名為「one2one」的形式。
scala會考慮如下位置的隱式轉換函式:
1、位於源或目標型別的伴生物件中的隱式函式
2、位於當前作用域可以以單個識別符號指代的隱式函式
隱式轉換在如下三種不同情況下會被考慮:
1、當表示式型別與預期型別不同時
2、當物件訪問乙個不存在成員時
3、當物件呼叫某個方法,而這個方法的引數宣告與傳入引數不匹配時
有三種情況編譯器不會嘗試使用隱式轉換
1、如果**能夠在不使用隱式轉換的前提下通過編譯,則不會使用隱式轉換
2、編譯器不會嘗試同事執行多個轉換
3、存在二義性的轉換是錯誤。
// 案例:特殊售票視窗(只接受特殊人群,比如學生、老人等)
class specialperson(val name : string)
class student(val name : string)
class older(val name : string)
//隱式轉換函式,將student和older轉變成specialperson型別
implicit def object2specialperson(obj : object) : specialperson =
case b : older =>
case _ => nil
}}
def buyspecialticket(sp : specialperson)
buyspecialticket(new student("student"))
執行結果:
執行結果:
由此可見,當呼叫到隱式轉換之後型別的方法時,會先呼叫隱士轉換方法,再呼叫,而且每一次呼叫都會先呼叫隱士轉換方法,在隱士轉換方法中建立出新的物件,那麼每一次的呼叫都要建立新的物件。
所謂的隱式引數,指的是在函式或者方法中,定義乙個用implicit修飾的引數,此時scala會嘗試找到乙個指定型別的,用implicit修飾的物件,即隱式值,並注入引數。
scala會在兩個範圍內查詢:一種是當前作用域內可見的val或var定義的隱式變數;一種是隱式引數型別的伴生物件內的隱式值。
case class delimiters(left : string, right : string)
def quote(content : string)(implicit d : delimiters)
implicit val defaultdelimiters = delimiters("")
quote("haha")
執行結果:
首先我們先看乙個例子:
這裡因為a沒有明確的型別,編譯器不確定它有《方法,因此報錯。
為了滿足上面的需求,我們使用隱式引數,轉換一下,讓a擁有《方法
ordered[t]特質中有乙個接受t引數的《操作符,因此不會出現最初的錯誤。
結合隱式轉換的概念,隱式轉換就是以implicit關鍵字宣告的帶有單個引數的函式,「implicit order : t => ordered[t]」完全符合概念,因此上面的寫法也滿足隱式轉換,將t隱式轉換成了ordered[t]物件。它不僅是隱式引數,也是隱式轉換,因此也可以這樣寫:
在scala中的模式匹配和樣例類 中已經有講過context boundse了。context bounds是一種特殊的bounds,它會根據泛型型別的宣告,比如「t: 型別」要求必須存在乙個型別為「型別[t]」的隱式值。表現形式為「t : m」,其中m是乙個泛型型別,它要求作用於中存在乙個型別為m[t]的隱式值。
scala的學習與研究將告一段落,接下來要開始探索spark原始碼了。
scala 隱式轉換
defdisplay input string unit println input implicit deftypeconvertor input int string input.tostring implicit deftypeconvertor input boolean string if...
scala 隱式轉換
隱式轉換就是 當scala編譯器進行型別匹配時,如果找不到合適的候選,那麼隱式轉化提供了另外一種途徑來告訴編譯器如何將當前的型別轉換成預期型別。使用方式 將方法或變數標記為implicit 將方法的引數列表標記為implicit 將類標記為implicit 宣告乙個帶有implicit修飾過引數的方...
Scala 隱式轉換
1.隱式轉換 隱式轉換函式是以implicit關鍵字宣告的帶有單個引數的函式。這種函式將會自動應用,將值從一種型別轉換為另一種型別。object scala01 implicitnotice val num1 int 1.1 println num1 1 隱式轉換函式的函式名可以是任意的,隱式轉換與...