scala 隱式轉換

2021-08-19 15:26:24 字數 2198 閱讀 2197

隱式轉換就是:當scala編譯器進行型別匹配時,如果找不到合適的候選,那麼隱式轉化提供了另外一種途徑來告訴編譯器如何將當前的型別轉換成預期型別。

使用方式:

- 將方法或變數標記為implicit

- 將方法的引數列表標記為implicit

- 將類標記為implicit

// 宣告乙個帶有implicit修飾過引數的方法

def person(implicit name: string): name

// 我們不能直接 person , 這樣呼叫, 但是可以

implicit val x = "mike"

//x被稱為隱式值

// 然後直接呼叫

person

隱式轉換為目標型別:把一種型別自動轉換到另一種型別

// 將整數轉換成字串型別:

def int2string(x: string) = x.tostring

通過隱式轉換,使物件能呼叫類中本不存在的方法

class

dataframe

object

todf

class

dataset

object

dataset

extends

import todf._

val ds = new dataset

ds.sqlmethod("select") //使用dataset中不存在的sql方法

}

在scala2.10後提供了隱式類,可以使用implicit宣告類

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

2.隱式類必須被定義在類,伴生物件和包物件裡

3.隱式類不能是case class(case class在定義會自動生成伴生物件與2矛盾)

4.作用域內不能有與之相同名稱的標示符

object

stringutils

}object

main

extends

import stringutils._

println("mobin".increment)

}

官方文件中的用法:

建立隱式類時,只需要在對應的類前加上implicit關鍵字。比如:

object

helpers

loop(x)

}}}

這個例子建立了乙個名為intwithtimes的隱式類。這個類包含乙個int值和乙個名為times的方法。要使用這個類,只需將其匯入作用域內並呼叫times方法。比如:

scala> import helpers._

import helpers._

scala> 5 times println("hi")

hihi

hihi

hi

使用隱式類時,類名必須在當前作用域內可見且無歧義,這一要求與隱式值等其他隱式型別轉換方式類似。

隱式轉換的時機:

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

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

隱式解析機制

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

1.首先會在當前**作用域下查詢隱式實體(隱式方法 隱式類 隱式物件)

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

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

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

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

伴生物件和string的伴生物件

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

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

scala 隱式轉換

defdisplay input string unit println input implicit deftypeconvertor input int string input.tostring implicit deftypeconvertor input boolean string if...

scala隱式轉換

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

Scala 隱式轉換

1.隱式轉換 隱式轉換函式是以implicit關鍵字宣告的帶有單個引數的函式。這種函式將會自動應用,將值從一種型別轉換為另一種型別。object scala01 implicitnotice val num1 int 1.1 println num1 1 隱式轉換函式的函式名可以是任意的,隱式轉換與...