Scala 隱式轉換

2021-09-18 01:54:32 字數 2295 閱讀 1517

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

如:

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

#單獨使用,語法肯定是錯誤的,但是可以使用如下的隱式轉換函式,編譯器會把double型別轉換為int型別

val l1 :int = 3.5

println(l1)

在實際開發中,我們難免會遇到為已存在的類庫新增一些我們需要但是庫中沒有的功能,這時隱式轉換的優勢就得以體現出來,不用修改類庫中任何的**,只需要使用隱式轉換就可以滿足我們的需要。

比如想為file增加乙個read方法,可以使用如下轉換:

class richfile(val from:file) 

implicit def file2richfile(from: file) = new richfile(from)

val contents = new file(pathname="./work").read

println(contents)

}

好處:在不修改原版本**同時為原本的**增加新的功能。

將變數標記為implicit,這樣編譯器會在方法省略隱式引數的情況下去自動搜尋作用域內的隱式值作為缺少引數。

implicit val a = "xiaoming"

def person(implicit name : string)= name

println(person)

注意:如果在此時在和上面**塊相同的作用域內再定義乙個隱式變數,當再次呼叫方法時候就會報錯:出現了二義性。

implicit val a = "xiaoming"

implicit val a1 = "xiaoming"

def person(implicit name : string)= name

println(person)

def func(message : string) = println(message)

implicit def int_to_string(x : int) = x.tostring

func(100)

package test

import test.learn

class dog

class skill

object learn

override def main(args: array[string]): unit =

}

在scala2.10之後的版本提供了隱式類,可以使用implicit宣告類,但是需要注意以下幾點:

- 其所帶的構造引數有且只能有乙個

- 隱式類必須定義在「類」或「伴生物件」或「包物件」裡

- 隱式類不能是case class(case class 在定義會自動生成伴生物件與上一點矛盾)

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

object stringutils 

} import unit15.stringutils._

println("mobin".increment)

}

當方法中的引數型別與目標型別不一致時

物件呼叫所在類中不存在的方法或成員時,編譯器會自動將物件進行隱式轉換

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

首先會在當前**作用域下查詢隱式實體(隱式方法、隱式類、隱式物件)如果第一條規則查詢隱式實體失敗,會繼續在隱式引數型別的作用域裡查詢。型別的作用域是指與該型別相關聯的全部伴生模組,乙個隱式實體的型別t的查詢範圍如下:

a)如果t被定義為t with a with b,那麼a、b都是t的部分,在隱式解析的過程中,他們的伴生物件都會被搜尋

b)如果t是引數化型別,那麼型別引數和與型別引數相關聯的部分都算作是t的部分,比如list[string]的隱式搜尋會搜尋list的伴生物件和string的伴生物件

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

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

1)不能存在二義性

2)隱式操作不能巢狀

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隱式轉換

目錄 隱式轉換的概念 隱式轉換的使用 隱式轉換做引數型別轉換 隱式轉換增強現有型別 隱式引數 利用隱式引數進行隱式轉換 再議context bounds 隱式轉換函式 implicit conversion function 是以implicit關鍵字宣告的帶有單個引數的函式,這樣的函式將被自動應用...