例子一:
這是乙個string=>randomaccessseq的隱式轉換,只要import這個隱式轉換,string會被編譯器替換為randomaccessseq
例子二:
implicit def int2string(x : int) = x.tostring
乙個int=>string的隱式轉換,import後,int會被編譯器替換為string
例子三:
implicit def double2int(x : double) = x.toint
乙個double=>int的隱式轉換,import後,double會被編譯器轉換為int
例子四:
implicit def int2double(x : int) = x.todouble
乙個int=>double的隱式轉換,import後,int會被編譯器轉換為double
例子一到例子四的implicit,看上去像是乙個巨集定義,只不過比巨集定義更加的聰明。當編譯器碰到了string、int、double時,會自動的將它們根據隱式轉換的規則進行轉換。
例子五:隱式引數
class preferreddrink(name : string){}
implicit val prompt = new preferredprompt("yes, master")
def greet(name : string)(implicit prompt : preferreddrink) =
在呼叫greet時,只需要傳入第乙個引數即可,因為隱式引數就像是巨集定義,取代了greet的第二個引數
例子六:帶有隱式引數的函式
def maxlist[t](elements : list[t])
(implicit orderer : t => ordered[t]) : t =
elements match
隱式引數orderer,型別是t=>ordered[t],提供了更多的t型別的資訊,型別t由list[t]指明,如果存在t=>ordered[t]的隱式轉換,則是有效的。
orderer是相當關鍵的引數資訊,就是為了說明t具體是什麼樣的,並不是隨便乙個型別可以滿足t=>ordered[t]的型別。
如果將implicit用於引數上,編譯器不僅將會嘗試用隱式值補足引數,還會把這個引數當做可用的隱式操作而用於方法體中。
例子六中的隱式引數使用方法非常的普遍,可以用「視界」來簡化maxlist:
def maxlist[t <% ordered[t]](elements : list[t]) : t,後面的方法是一樣的。
注意,這裡是<%(視界),而不是<:(上界),覺得「視界」比「上界」多了乙個隱式轉換。
Scala implicit 隱式轉換總結
package com.demo object implicitpram 當部分引數為implicit引數時,需使用柯里化方式定義,且隱式引數在後面,呼叫時,可以只使用 乙個顯示的引數,也可以同時使用隱式和非隱式引數。param name param a def test p2 name strin...
Scala的隱式引數 隱式值 隱式物件
trait calc t 使用隱式值轉換到隱式引數 class multiplywithint extends calc int class multiplywithstring extends calc string 定義隱式值 implicit val i new multiplywithint...
scala隱式引數 隱式函式 隱式類詳解
隱式函式 隱式類1 定義乙個普通變數,使用 implicit 關鍵字修飾,定義乙個函式呼叫這個變數當引數時,此時這個引數就被稱為隱式引數 2 隱式引數的作用 減少提供函式引數的數量,讓某些引數擁有隱藏的值 隱式變數 def main args array string unit def fun2 a...