1:概念: 隐式(implicit)是Scala的一个强大特性,同时也是一个可能存在正义的特性。使用隐式能够减少代码,能够向已有类型中注入新的方法,也能够创建领域特定语言(DSL)。 隐式之所以产生争议,是因为除了通过Predef对象自动加载的哪些隐式对象外,其他在源码中出现的隐式对象均不是本地对象。隐式对象一旦进入作用域,编译器便能执行该隐式对象以生成方法参数或者将指定参数转化为预期类型。不过在阅读源码是,读者无法简单的指出什么时候会应用这些隐式值和隐式方法,可能给读者造成困惑。
2,举例说明
我们使用implicit关键字标记那些用户无需显示提供的方法参数。调用方法是,如果未输入隐式参数且代码所处作用域中存在类型兼容值时,类型兼容值会从作用域中调出,反之系统会报错。假设我们定义了一个作用于man 变 SuperMan的方法,在此举一个小例子来简单演示implicit的应用:
class Man (val name : String) /*第一种方式 * object Man{ * implicit def man2SuperMan(man:Man) = new SuperMan(man.name) * } * */ class SuperMan(val name:String){ def makeMiracles = println(this.name+"WOW WOw,i am superman") } object IMFimplicits{ implicit def man2SuperMan(man:Man) = new SuperMan(man.name) } object HelloImplicit { def main(args: Array[String]) { import com.dt.spark.sql.IMFimplicits._ val man = new Man("Scala") man.makeMiracles //做默认的配置 implicit val content = "Dollar" //talk("java")("money") talk("java") talk("java")("spark") } def talk(name : String)(implicit content:String) = println(name+":"+content) }输出的结果为:
ScalaWOW WOw,i am superman java:Dollar java:spark本博客内容根据大数据Spark “蘑菇云”行动前传第16课:Scala implicits编程彻底实战及Spark源码鉴赏 1 Spark源码Scala implicits的使用 2 Scala implicits实战 3 Scala implicits企业级最佳实践 内容进行总结的学习笔记
