scala implicit隱式轉化示例

2021-07-24 07:01:58 字數 1358 閱讀 4295

例子一:

這是乙個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...