Scala隱式轉換幾種使用場景
Scala提供的隱式轉換的特性的作用,簡單說就是:當Scala編譯器進行型別匹配時,如果找不到合適的型別,那麼隱式轉換會讓編譯器在作用範圍內自動推匯出合適的型別,在程式碼重構設計上,可以避免冗餘的程式碼,使得程式碼非常優雅。
使用場景一:隱式引數
scala> def sayHello(age: Int)(implicit name: String) = println("my name is:" + name + ",my age is:" + age) sayHello: (age: Int)(implicit name: String)Unit scala> implicit val name = "cyony" name: String = cyony scala> sayHello(25) my name is:cyony,my age is:25
sayHello函式有兩個引數,其中name為隱式引數,在實際呼叫中不需要顯示傳入這個引數,但是在作用域範圍內必須宣告一個String型別的隱式變數,這樣在呼叫的時候,會自動傳入這個變數。PS:如果在同一個作用域內定義了兩個同類型的隱式變數,則會有衝突。
隱式引數的作用域範圍有兩個:一種是當前作用域內可見的val或者var定義的隱式變數;一種是隱式引數型別的伴生物件內的隱式值。
scala> implicit val name1 = "cyony1" name1: String = cyony1 scala> sayHello(25) <console>:16: error: ambiguous implicit values: both value name of type => String and value name2 of type => String match expected type String sayHello(25) ^
使用場景二:型別匹配
scala> import scala.language.implicitConversions import scala.language.implicitConversions scala> implicit def int2Range(num : Int): Range = 1 to num int2Range: (num: Int)Range scala> def spreadNum(range: Range): String = range.mkString(",") spreadNum: (range: Range)String scala> spreadNum(5) res0: String = 1,2,3,4,5
上面所示,spreadNum函式簽名是個Range型別的引數,但是傳入的值是一個Int型別的,所以編譯器在作用域內找到了int2Range隱式轉換函式,自動將int轉換為range物件來適配。
隱式轉換的函式叫什麼名字無所謂,因為實際呼叫中不會手動呼叫,但是如果需要使用隱式轉換函式,需要import方式手動匯入,才能被編譯器尋找到。
使用場景三:型別增強
scala> class Man(val name: String)
defined class Man
scala> class SuperMan(val name: String) {
| def fly = println("you can fly")
| }
defined class SuperMan
scala> implicit def man2SuperMan(man: Man): SuperMan = new SuperMan(man.name)
man2SuperMan: (man: Man)SuperMan
scala> val cyony = new Man("cyony")
cyony: Man = [email protected]
scala> cyony.fly
you can fly
編譯器在呼叫fly方法時,發現Man物件並沒有這個函式,然後通過man2SuperMan隱式函式轉換成SuperMan物件,進而呼叫他的fly函式,來實現型別增強功能。
或者可以通過隱式類的方式來實現相同的功能,程式碼如下:
scala> class Man(name: String)
defined class Man
scala> implicit class MyImplicitTypeConversion(val man: Man) {
| def fly = println("you can fly")
| }
defined class MyImplicitTypeConversion
scala> val cyony = new Man("cyony")
cyony: Man = [email protected]
scala> cyony.fly
you can fly
隱式轉換的發生時機:
1、呼叫某個函式,但是給函式傳入的引數型別,與函式定義的簽名不匹配。
2、使用某個型別物件,呼叫某個方法,而這個方法並不存在於該型別時。
3、使用某個型別物件,呼叫某個方法,雖然該型別有這個方法,但是給方法傳入的引數型別與簽名並不一致的時候。
相關推薦
Scala隱式轉換幾種使用場景
Scala提供的隱式轉換的特性的作用,簡單說就是:當Scala編譯器進行型別匹配時,如果找不到合適的型別,那麼隱式轉換會讓編譯器在作用範圍內自動推匯出合適的型別,在程式碼重構設計上,可以避免冗餘的程式碼,使得程式碼非常優雅。 使用場景一:隱式引數scala>
記錄: 一次解決整型溢出攻擊(使用scala,隱式轉換)
multi run 沒有 出了 range println multiple valid ont 最近項目遇到一次整型溢出攻擊 有一個功能,玩家購買num個物品. 每個物品花費14貨幣. 客戶端限制玩家只能購買 1-9999個該物品. 但是某玩家通過技術手段,獲得了客戶端的
6、Scala隱式轉換
一、Scala隱式轉換使用場景 1、用於從一種型別到另一種型別的轉換。 2、用於缺少引數方法的呼叫 二、Scala隱式轉換分類 1、隱式方法  
Spark基礎--Scala隱式轉換
1、隱式轉換 通常在處理兩個開發時完全不知道對方才能在的軟體或型別庫時非常有用,他們各自都有自己的方式描述某個概念,而這個概念本質上是描述同一件事。隱式轉換可以減少一個型別顯示轉換成另一個型別的需要。 2、隱式轉換規則 隱式定義指可以允許編譯器插入程式解決型別錯誤的定義。比如如果a+b是不能
scala隱式轉換
1、隱式轉換概述:為一個已經存在的東西新增新的功能上去 需求:為一個已存在的類新增一個新的方法,不用原始碼對第三方新增新的方法 2、隱式轉換 3、隱式引數 在函式或者方法中,定義一個用implicit修飾的引數,此時scala會嘗試找到一個指定型別的,用impli
Scala 隱式轉換和隱式引數
1.隱式轉換 隱式轉換函式是以implicit關鍵字宣告的帶有單個引數的函式。這種函式將會自動應用,將值從一種型別轉換為另一種型別。 implicit def a(d: Double) = d.toInt //不加上邊這句你試試 val i1:
【圖文詳細 】Scala——隱式轉換和隱式引數
2、Scala 隱式轉換和隱式引數 隱式轉換和隱式引數是 Scala 中兩個非常強大的功能,利用隱式轉換和隱式引數,你可以提 供優雅的類庫, 對類庫的使用者隱匿掉那些枯燥乏味的細節。 隱式的對類的方法進行增強,豐富現有類庫的功能 &nbs
Scala學習筆記(7)—— Scala 隱式轉換
1 隱式轉換概述 需求: 為一個已存在的類新增一個新的方法(不知道這個類的原始碼) java: 動態代理 scala : 隱式轉換(雙刃劍) package com.scalatest.scala.hide object ImplicitApp exte
Scala(隱式轉換)-第七天
1、隱式轉換概述 需求:為一個已存在的類新增一個新的方法 java:動態代理 scala:隱式轉換 2、隱
Scala:隱式轉換與隱式引數
Scala的隱式轉換,其實最核心的就是定義隱式轉換函式,即implicit conversion function。定義的隱式轉換函式,只要在編寫的程式內引入,就會被Scala自動使用。Scala會根據隱式轉換函式的簽名,在程式中使用到隱式轉換函式接收的引數型別定義的物件時,會自動將其傳入隱
扒一扒scala隱式轉換
操作規則: 1.作用域,scala編譯器將僅考慮作用域之內的隱式轉換,要使用某種隱式操作,你必須以單一識別符號的形式(一種情況例外)將其帶入作用域之內。例如: object TestImplicit { implicit def doubleToIn
Scala隱式轉換和作用域分析
1 Scala隱式轉換內幕 2 Scala作用域 3 Scala隱式轉換思考 /** * 隱式轉換和作用域 */ class Implicits(x: Int) { def printValue = { val x = 100 println(x)
Scala 中的隱式轉換和隱式參數
定義 定義函數 scala 行為 hub 隱式 實現 發現 com 隱式定義是指編譯器為了修正類型錯誤而允許插入到程序中的定義。 舉例: 正常情況下 顯然會報錯,因為 String 類並沒有實現 / 這個方法,我們無法去決定 String 類的行為,這個時候就可以用上 im
scala中隱式轉換之隱式類
des object 同名 生成 ase end app scala getname /** * Created by root * Description :隱式類: * 1.其所帶的構造參數有且只能有一個;並且構造器的參數是轉換之前的對象 * 2.隱式
scala中隱式轉換之隱式轉換調用類中本不存在的方法
esc rip args root imp 轉換 存在 val 轉換成 /** * Created by root * Description : 隱式轉換調用類中本不存在的方法 */ class Person(name : String){ def g
scala筆記-隱式轉換與隱式引數(16)
Scala提供的隱式轉換和隱式引數功能,是非常有特色的功能。是Java等程式語言所沒有的功能。它可以允許你手動指定,將某種型別的物件轉換成其他型別的物件。通過這些功能,可以實現非常強大,而且特殊的功能。 Scala的隱式轉換,其實最核心的就是定義隱式轉換函式,即implicit conv
大資料之scala(四) --- 模式匹配,變數宣告模式,樣例類,偏函式,泛型,型變,逆變,隱式轉換,隱式引數
一、模式匹配:當滿足case條件,就終止 ---------------------------------------------------------- 1.更好的switch var x = '9'; x match{ case
scala高階語法之柯里化(curring)和 隱式轉換(implicit)
柯里化(curring)和 隱式轉換(implicit) 柯里化(curring) scala 中 curring 是將一個正常的方法轉換為科裡化的一個過程 把一個引數列表中的多個引數轉換為多個列表 如:①→② ① def m1(a:Int,b:Int)=a+b
Scala基礎:閉包、柯里化、隱式轉換和隱式引數
閉包,和js中的閉包一樣,返回值依賴於宣告在函式外部的一個或多個變數,那麼這個函式就是閉包函式。 val i: Int = 20 //函式func的方法體中使用了在func外部定義的變數 那func就是個閉包函式 val func = (x: Int) => x +
[Scala]學習筆記五——隱式轉換
隱式轉換:為一個已經存在的東西,新增一個功能需求(比如:為一個已經存在的類新增一個新的方法) 滿足上述需求,Java使用的是動態管理,Scala使用的是隱式轉換 一個例子: //定義了兩個類Man和Superman,現在的需求是Man的物件也可以擁有fly()方法 object I