温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

scala隐式转换的用法

发布时间:2021-09-16 22:16:10 来源:亿速云 阅读:129 作者:chen 栏目:大数据

本篇内容介绍了“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

再次执行就正常了

scala隐式转换的用法

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)。

 少了第一步会报错。

scala隐式转换的用法

此种情况在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相关产品源码,如mongodbredis等于spark结合实现源码原理有着至关重要的作用。

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

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI