scala語言中的隱式轉換是乙個十分強大的語言特性,主要可以起到兩個作用:
一.自動進行某些資料型別的隱式轉換
string型別是不能自動轉換為int型別的,所以當給乙個int型別的變數或常量賦予string型別的值時編譯器將報錯。所以,一下語句是錯誤的。
val x: int = "100"
如果需要將乙個字串型別的整形數值賦給int,比如使用string.toint方法,例如:
val x: int = "100".toint
如果想讓字串自動轉換為整形,就可以使用隱式轉換。可以定義如下函式。
implicit def strtoint(str: string) = str.toint
這時你再對int型別的變數賦值字串時,字串就會自動轉換為int。
scala> val x:int = "00"
x: int = 100
如果你此時定義乙個兩數相加的函式
def add(x: int, y: int) = x + y
就可以達到這種效果:
scala> add("100", 200)
res1: int = 300
www.cppcns.com
隱式轉換有一定的使用規則,比較重要的有2個。
1.按照《scala程式設計》這本書中所說:插入的隱式轉換必須以單一識別符號的形式處於作用fgrcbyr域中,或與轉換的源或目標型別關聯在一起。scala編譯器將僅考慮處於作用域之內的隱式轉換。
簡而言之,就是在使用隱式轉換之前,需要用import把隱式轉換引用到當前的作用域裡或者就在作用域裡定義隱式轉換。除了隱式轉換被引入進當前作用域之外,還有一種方式可以使用隱式轉換,就是編譯器會在源型別或者期望的伴生物件中尋找隱式定義。
2.無歧義規則:隱式轉換只能在無其他可用轉換的前提下才能操作。如果在同一作用域裡,對同一源型別定義乙個以上的隱式轉換函式,如果多種隱式轉換函式都可以匹配,那麼編譯器將報錯,所以在使用時請移除不必要的隱式定義。
二.隱式引數
柯里化函式會有多個引數列表,當希望對某個引數列表採用預設引數時,可以使用implicit提供的隱式引數功能。做法是在需要自動填充的引數列表最開端加上implicit,然後在定義域內定義需要填充的預設引數值常量,並在常量的定義之前宣告implicit。
視界當有如下定義時
class container[a
表示a型別必須可視為int。簡單的說,就是需要有乙個轉換函式,可以自動的將a型別,轉換為int型別,如果沒有這樣的轉換函式,可以使用implicit定義。
寫乙個類測試一下scala中的隱式轉換的用法:
class fraction(n: int, d: int)
//伴生物件
object fraction
def unapply程式設計客棧(frac: fraction) = if (frac.den == 0) none else some((frac.num, frac.den))
}object testfrac extends app
本文標題: scala中的隱式型別轉換的實現
本文位址: /ruanjian/j**a/262433.html
Scala的隱式轉換
今天讀scala 遇到了implict關鍵字,參考部落格對其分析,並自己實際動手編碼,主要了解了scala中的隱式函式的用法 def main args array string unit 輸出 3要點如下 import scala.language.implicitconversions impl...
Scala的隱式轉換
在整個作用域,隱式轉換的名字要唯一 隱式有隱式值 隱式引數,隱式函式,隱式類,隱式物件 關鍵字implicit 轉換時機 當方法的引數型別與目標型別不一致時 當呼叫的類裡的方法與類中不一致時 也就是說編譯器在隱式轉換時是在查詢缺失資訊,這個缺失資訊就在所在作用域裡找。1個匹配 object demo...
scala 隱式轉換
defdisplay input string unit println input implicit deftypeconvertor input int string input.tostring implicit deftypeconvertor input boolean string if...