Scalar_scala yield

Scalar_scala yield掌握implicit的用法是阅读spark源码的基础,也是学习scala其它的开源框架的关键,implicit可分为:隐式参数隐式转换类型隐式调用函数1.隐式参数当我们在定义方法时,可以把最后一个参数列表标记为implicit,表示该组参数是隐式参数。一个方法只会有一个隐式参数列表,置于方法的最后一个参数列表。如果方法有多个隐式参数,只需一个implicit修饰即可。当调用包含隐式参数的方法是…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

掌握implicit的用法是阅读spark源码的基础,也是学习scala其它的开源框架的关键,implicit 可分为:

  • 隐式参数
  • 隐式转换类型
  • 隐式调用函数

1.隐式参数

当我们在定义方法时,可以把最后一个参数列表标记为implicit,表示该组参数是隐式参数。一个方法只会有一个隐式参数列表,置于方法的最后一个参数列表。如果方法有多个隐式参数,只需一个implicit修饰即可。 当调用包含隐式参数的方法是,如果当前上下文中有合适的隐式值,则编译器会自动为改组参数填充合适的值。如果没有编译器会抛出异常。当然,标记为隐式参数的我们也可以手动为该参数添加默认值。def foo(n: Int)(implicit t1: String, t2: Double = 3.14)

scala > def calcTax(amount: Float)(implicit rate: Float): Float = amount * rate
scala > implicit val currentTaxRate = 0.08F
scala > val tax = calcTax(50000F) // 4000.0

Jetbrains全家桶1年46,售后保障稳定

  • 1
  • 2
  • 3

如果编译器在上下文没有找到第二行代码会报错

2.隐式地转换类型

使用隐含转换将变量转换成预期的类型是编译器最先使用 implicit 的地方。这个规则非常简单,当编译器看到类型X而却需要类型Y,它就在当前作用域查找是否定义了从类型X到类型Y的隐式定义 
例子:

scala> val i: Int = 3.5 //直接报错
加上这句:
scala> implicit def double2Int(d: Double) = d.toInt
再运行,没报错
scala> val i: Int = 3.5  //i=3
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

3.隐式调用函数

隐式调用函数可以转换调用方法的对象,比如但编译器看到X .method,而类型 X 没有定义 method(包括基类)方法,那么编译器就查找作用域内定义的从 X 到其它对象的类型转换,比如 Y,而类型Y定义了 method 方法,编译器就首先使用隐含类型转换把 X 转换成 Y,然后调用 Y 的 method。 
例子:

class SwingType{ 
   
  def  wantLearned(sw : String) = println("兔子已经学会了"+sw)
}
object swimming{ 
   
  implicit def learningType(s : AminalType) = new SwingType
}
class AminalType
object AminalType extends App{ 
   
  import com.mobin.scala.Scalaimplicit.swimming._
  val rabbit = new AminalType
    rabbit.wantLearned("breaststroke")         //蛙泳
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

上例中编译器在rabbit对象调用时发现对象上并没有wantLearning方法,此时编译器就会在作用域范围内查找能使其编译通过的隐式视图,找到learningType方法后,编译器通过隐式转换将对象转换成具有这个方法的对象,之后调用wantLearning方法

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/203695.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 多台服务器共享session问题

    多台服务器共享session问题

    2021年10月26日
    46
  • Java集合篇:集合类介绍

    Java集合篇:集合类介绍

    2021年10月4日
    45
  • 金山词霸2007升级v10.0.0.4

    金山词霸2007升级v10.0.0.4词霸2007不但产品功能更加完善,而且在用户的体验方面也做了很多改进。首先,词霸07收录了150余本权威词典,70余个专业词库,同时支持28种常备资料线实时更新,让您随时拥有奥运知识、常用工具(货币单位等)等最新的资料;其次全面支持简体中文、英文、日文查词功能,满足更多用户需求;值得一提的是,词霸07收录了与朗文、牛津、韦氏齐名四大词典的《美国传统词典》最新版,英汉、英英双解,包含96000余词条

    2022年7月15日
    19
  • 遍历hashmap的三种方式_HashMap

    遍历hashmap的三种方式_HashMappublicstaticvoidmain(String[]args){Map<String,String>map=newHashMap();map.put(“aa”,”11″);map.put(“bb”,”22″);Set<String>set=map.keySet();Iteratoriter=set.iterator();while(iter.

    2025年7月9日
    5
  • sklearn.KFold「建议收藏」

    sklearn.KFold「建议收藏」K折交叉验证:将样本切成K份,每次取其中一份做为测试集,剩余的K-1份做为训练集。在sklearn.model_selection中提供了几种K折交叉验证。生成样本&amp;gt;&amp;gt;&amp;gt;fromsklearn.datasetsimportmake_classification&amp;gt;&amp;gt;&amp;gt;data,target=make_classification(n_…

    2026年1月30日
    3
  • Linux系统定时任务「建议收藏」

    Linux系统定时任务定时任务CrondCrond是linux系统中用来定期执行命令/脚本或指定程序任务的一种服务或软件,一般情况下,我们安装完Centos5/6linux操作系统之后,默认便会启动Crond任务调度服务。Crond服务会定期(默认每分钟检查一次)检查系统中是否有要执行的任务工作,如果有,便会根据其预先设定的定时任务规则自动执行该定时任务工作,这个crond定…

    2022年4月16日
    48

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号