千家信息网

scala隐式转换的用法

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,本篇内容介绍了"scala隐式转换的用法"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一,简介从类型
千家信息网最后更新 2026年10月31日scala隐式转换的用法

本篇内容介绍了"scala隐式转换的用法"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

一,简介

从类型S到类型T的隐式转换由具有函数类型S => T的隐式值定义,或者通过可转换为该类型的值的隐式方法来定义。隐含转换适用于两种情况:

1),如果表达式e是类型S,并且S不符合表达式的期望类型T.

2),在具有类型S的e的e.m表达中,如果m不表示S的成员

在第一种情况下,搜索适用于e并且其结果类型符合T的转换c。在第二种情况下,搜索适用于e的转换c,其结果包含名为m的成员。

列表[Int]的两个列表xs和ys的以下操作是合法的:

xs <= ys

前提是下面定义的隐式方法list2ordered和int2ordered在范围内:


implicit def list2ordered[A](x: List[A])(implicit elem2ordered: A => Ordered[A]): Ordered[List[A]] =new Ordered[List[A]] { /* .. */ }
implicit def int2ordered(x: Int): Ordered[Int] =new Ordered[Int] { /* .. */ }

隐式导入的对象scala.Predef声明了一些预定义的类型(例如Pair)和方法(例如,assert),还有一些隐式转换。例如,当调用期望java.lang.Integer的Java方法时,可以自由地传递一个scala.Int。这是因为Predef包含以下隐式转换:


import scala.language.implicitConversions
implicit def int2Integer(x: Int) =java.lang.Integer.valueOf(x)

因为隐式转换可能有缺陷,如果不加区别地使用,编译器在编译隐式转换定义时会发出警告。

若要关闭警告,请采取以下任何一种操作:

1),将scala.language.implicitConversions导入隐式转换定义的范围

2),调用编译器时,加上:-language:implicitConversions

当编译器应用转换时,不会发出警告。

二,demo

1,第一种情况的demo

直接使用,会报错

val i: Int = 1.5

定义隐式转化方法

implicit def double2Int(d: Double) = d.toInt

再次执行就正常了

2,第二种情况的demo

class MYDF{  def  show(sw : String) = println(sw)}object RDD2DF{  implicit def rdd2df(s : MYRDD) = new MYDF}class MYRDDobject AminalType extends  App{  import yourpackage.RDD2DF._  val test = new MYRDD  test.show("RDD converts into DF")         }

编译器在执行test 对象的时候并没有show方法,此时编译器就会在作用域范围内查找能使其编译通过的隐式视图,找到RDD2DF的隐式转换方法后,会先进行隐式转换,之后调用show方法。

3,隐式转化参数

在定义一个方法时可以把最后一个参数列表定义为隐式参数。这个在spark内部使用也是非常广泛,比如前面发表的文章spark累加器原理,自定义累加器及陷阱就用到了。

如果方法有多个隐式参数,只需一个implicit修饰即可。当调用包含隐式参数的方法是,如果当前上下文中有合适的隐式值,则编译器会自动为改组参数填充合适的值。如果没有编译器会抛出异常。当然,标记为隐式参数的我们也可以手动为该参数添加默认值。

def foo(n: Int)(implicit t1: String, t2: Double = 3.14)。

少了第一步会报错。

此种情况在Spark中的使用,举例:

def accumulator[T](initialValue: T, name: String)(implicit param: AccumulatorParam[T])  : Accumulator[T] = {  val acc = new Accumulator(initialValue, param, Some(name))  cleaner.foreach(_.registerAccumulatorForCleanup(acc))  acc}

三,总结

彻底搞懂scala隐式转换,对我们了解spark及spark相关产品源码,如mongodb,redis等于spark结合实现源码原理有着至关重要的作用。

"scala隐式转换的用法"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

方法 类型 编译 参数 情况 编译器 范围 合适 作用 内容 原理 对象 成员 文章 更多 源码 知识 累加器 结果 表达式 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 有格互联网科技 上海睿民互联网科技有限公司 圆梦互联网科技 成都互联网科技公司 深圳齐家互联网科技 致聘互联网科技 北京禾田雨橡互联网科技 睿民互联网科技 成都互联网科技公司100强 深圳市优智互联网科技有限公司 链环科技传统企业怎么转型互联网 互联网营销推广黑科技 图游互联网科技 互联网科技包装股份有限公司上市 长沙渺峰互联网科技有限公司 兰石爱特工业互联网科技分公司 杭州融税互联网科技有限公司 网互联网络科技 科技互联网企业在行动 知域互联网科技有限公司官网 互联网科技名片 互联网科技的英文 佰商互联网科技有限公司 哈尔滨新华互联网科技 互联网汽车科技小镇 福州新华互联网科技学校 知乎 重庆互联网医院沙龙医盟信息科技 新氧科技和美国互联网有关系吗 10位科技互联网大佬 互联网领先科技成果宣传视频
0