在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Scala/ 隱含類型轉(zhuǎn)換
轉(zhuǎn)換被方法調(diào)用的對象
View 限定
概述
當(dāng)有多個(gè)隱含轉(zhuǎn)換可以選擇時(shí)
隱含參數(shù)(二)
隱含參數(shù)(一)
使用 implicits 的一些規(guī)則
隱含類型轉(zhuǎn)換

隱含類型轉(zhuǎn)換

使用隱含轉(zhuǎn)換將變量轉(zhuǎn)換成預(yù)期的類型是編譯器最先使用 implicit 的地方。這個(gè)規(guī)則非常簡單,當(dāng)編譯器看到類型X而卻需要類型Y,它就在當(dāng)前作用域查找是否定義了從類型X到類型Y的隱式定義。

比如,通常情況下,雙精度實(shí)數(shù)不能直接當(dāng)整數(shù)使用,因?yàn)闀?huì)損失精度:

scala> val i:Int = 3.5
<console>:7: error: type mismatch;
 found   : Double(3.5)
 required: Int
       val i:Int = 3.5
                   ^

當(dāng)然你可以直接調(diào)用 3.5.toInt。

這里我們定義一個(gè)從 Double 到 Int 的隱含類型轉(zhuǎn)換的定義,然后再把 3.5 賦值給整數(shù),就不會(huì)報(bào)錯(cuò)。

scala> implicit def doubleToInt(x:Double) = x toInt
doubleToInt: (x: Double)Int
scala> val i:Int = 3.5
i: Int = 3

此時(shí)編譯器看到一個(gè)浮點(diǎn)數(shù) 3.5,而當(dāng)前賦值語句需要一個(gè)整數(shù),此時(shí)按照一般情況,編譯器會(huì)報(bào)錯(cuò),但在報(bào)錯(cuò)之前,編譯器會(huì)搜尋是否定義了從 Double 到 Int 的隱含類型轉(zhuǎn)換,本例,它找到了一個(gè) doubleToInt。 因此編譯器將把

val i:Int = 3.5

轉(zhuǎn)換成

val i:Int = doubleToInt(3.5)

這就是一個(gè)隱含轉(zhuǎn)換的例子,但是從浮點(diǎn)數(shù)自動(dòng)轉(zhuǎn)換成整數(shù)并不是一個(gè)好的例子,因?yàn)闀?huì)損失精度。 Scala 在需要時(shí)會(huì)自動(dòng)把整數(shù)轉(zhuǎn)換成雙精度實(shí)數(shù),這是因?yàn)樵?Scala.Predef 對象中定義了一個(gè)

implicit def int2double(x:Int) :Double = x.toDouble

而 Scala.Predef 是自動(dòng)引入到當(dāng)前作用域的,因此編譯器在需要時(shí)會(huì)自動(dòng)把整數(shù)轉(zhuǎn)換成 Double 類型。