中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

scala中怎么實現隱式類型轉換

發布時間:2021-08-07 15:01:17 來源:億速云 閱讀:138 作者:Leah 欄目:編程語言

本篇文章給大家分享的是有關scala中怎么實現隱式類型轉換,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

一.自動進行某些數據類型的隱式轉換

String類型是不能自動轉換為Int類型的,所以當給一個Int類型的變量或常量賦予String類型的值時編譯器將報錯。所以,一下語句是錯誤的。

val x: Int = "100"

如果需要將一個字符串類型的整形數值賦給Int,比如使用String.toInt方法,例如:

val x: Int = "100".toInt

如果想讓字符串自動轉換為整形,就可以使用隱式轉換。可以定義如下函數。

implicit def strToInt(str: String) = str.toInt

這時你再對Int類型的變量賦值字符串時,字符串就會自動轉換為Int。

scala> val x:Int = "00"x: Int = 100

如果你此時定義一個兩數相加的函數

def add(x: Int, y: Int) = x + y

就可以達到這種效果:

scala> add("100", 200)res1: Int = 300

隱式轉換有一定的使用規則,比較重要的有2個。

1.按照《Scala編程》這本書中所說:插入的隱式轉換必須以單一標識符的形式處于作用域中,或與轉換的源或目標類型關聯在一起。Scala編譯器將僅考慮處于作用域之內的隱式轉換。

簡而言之,就是在使用隱式轉換之前,需要用import把隱式轉換引用到當前的作用域里或者就在作用域里定義隱式轉換。除了隱式轉換被引入進當前作用域之外,還有一種方式可以使用隱式轉換,就是編譯器會在源類型或者期望的伴生對象中尋找隱式定義。

2.無歧義規則:隱式轉換只能在無其他可用轉換的前提下才能操作。如果在同一作用域里,對同一源類型定義一個以上的隱式轉換函數,如果多種隱式轉換函數都可以匹配,那么編譯器將報錯,所以在使用時請移除不必要的隱式定義。

二.隱式參數

柯里化函數會有多個參數列表,當希望對某個參數列表采用默認參數時,可以使用implicit提供的隱式參數功能。做法是在需要自動填充的參數列表最開端加上implicit,然后在定義域內定義需要填充的默認參數值常量,并在常量的定義之前聲明implicit。

視界

當有如下定義時

class Container[A <% Int] { def addIt(x: A) = 123 + x }

表示A類型必須可視為Int。簡單的說,就是需要有一個轉換函數,可以自動的將A類型,轉換為Int類型,如果沒有這樣的轉換函數,可以使用implicit定義。

寫一個類測試一下Scala中的隱式轉換的用法:

class Fraction(n: Int, d: Int) {// def den = d private val den = d;// def num = n 類參數定義為方法或字段都可以 private val num = n;// 定義乘法 def *(other: Fraction) = Fraction(other.num * this.num, other.den * this.den)// 重寫toString override def toString() = s"$num / $den" }//伴生對象object Fraction {// implicit隱轉 方法名無關可以隨意改,自動調用 implicit def int2Fraction(n: Int) = Fraction(n, 1) def apply(n: Int, d: Int) = {  new Fraction(n, d) } def unapply(frac: Fraction) = if (frac.den == 0) None else Some((frac.num, frac.den))}object TestFrac extends App{// 3 隱式調用了int2Fraction方法被轉化為一個Fraction對象Fraction(3,1) val result = 3 * Fraction(4,5)// 也可以顯示調用 val result2 = Fraction.int2Fraction(5) * Fraction(3,4) println(result)// unapply val Fraction(num,den) = result println(num,den)}

以上就是scala中怎么實現隱式類型轉換,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

沙雅县| 高台县| 子洲县| 长阳| 敦煌市| 乐昌市| 大新县| 舟山市| 南康市| 同德县| 日照市| 都江堰市| 常熟市| 双流县| 定兴县| 颍上县| 山阳县| 保定市| 东丰县| 南澳县| 镇康县| 横山县| 天全县| 叙永县| 临桂县| 海南省| 大新县| 安福县| 阿荣旗| 博客| 镇安县| 洛宁县| 兴化市| 建平县| 财经| 申扎县| 界首市| 江达县| 浦东新区| 晋宁县| 海阳市|