隐式转换:当某个类没有具体的方法时,可以在该类的伴生对象或上下文中查找是否存在隐式转换,将其转换为可以调用该方法的类,通过代码简单的描述下

一:隐式转换
1、定义类Man
class Man(val name: String)
2、定义类SuperMan,并在类中定义一个方法
class SuperMan(val name: String) {
def makeMiracles = println(this.name + " is super man!")
}
3、在main方法中实例化man类,并调用makeMiracles方法,这时编译报错,提示man中没有这样的方法
val man = new Man("Scala")
man.makeMiracles // 编译报错,提示man中无这样的方法
4、这时候我们就可以通过隐式转换的方式将man转换为SuperMan,这时候就可以调用makeMiracles
object Man {
//隐式转换
implicit def manToSuperMan(man: Man) = new SuperMan(man.name)
} 完整代码:
class Man(val name: String)
class SuperMan(val name: String) {
def makeMiracles = println(this.name + " is super man!")
}
object Man {
//隐式转换
implicit def manToSuperMan(man: Man) = new SuperMan(man.name)
}
def main(args: Array[String]): Unit = {
val man = new Man("Scala")
man.makeMiracles
} 二:隐式参数
简单看下代码:
def talk(name: String)(implicit content: String) {
println(name + ":" + content)
}
这里的content就是定义为隐式参数,在调用的时候如果定义了隐式变量,则可以不传content参数
implicit val content = "Money"
talk("Spark") //如果上下文没有定义隐式变量,则需传两个参数,也可以传两个参数进行覆写隐式值
talk("Spark")("Scala") //Scala会覆盖Money 三:隐式类
//隐式类
implicit class sum(x: Int) {
def add(y: Int) = x + y
}
//隐式类
println(3.add(2)) //本身3是没有add这样的方法,通过隐式类转换,就可以实现这样的功能,主要是看上下文中是否有参数为Int类型的隐式转换操作 四:隐式对象
示例代码:
abstract class Template[T] {
def add(x: T, y: T): T
def unit: T
}
//隐式对象
object ScalaImplicitObject {
implicit object StringAdd extends Template[String] {
override def add(x: String, y: String) = x.concat(y)
override def unit: String = ""
}
implicit object IntAdd extends Template[Int] {
override def add(x: Int, y: Int) = x + y
override def unit: Int = 0
}
} 定义sum方法
def sum[T](list: List[T])(implicit t: Template[T]): T = {
if (list.isEmpty) t.unit
else t.add(list.head, sum(list.tail)) //递归调用sum
} 在main方法中调用
import com.dt.scala.ScalaImplicitObject._ //导入隐式转换
println(sum(List(1 to 100: _*)))
println(sum(List("Spark", "-", "Scala")))

  

Scala实战高手****第16课:Scala implicits编程彻底实战及Spark源码鉴赏的更多相关文章

  1. Scala实战高手****第8课:零基础实战Scala最常用数据结构Map和Tuple及Spark源码鉴赏

    本课内容1.Map和Tuple在Spark源码中的鉴赏2.Map和Tuple代码操作实战 ------------------------------------------------------- ...

  2. Scala实战高手****第12课:Scala函数式编程进阶(匿名函数、高阶函数、函数类型推断、Currying)与Spark源码鉴赏

    /** * 函数式编程进阶: * 1.函数和变量一样作为Scala语言的一等公民,函数可以直接赋值给变量 * 2.函数更常用的方式是匿名函数,定义的时候只需要说明输入参数的类型和函数体即可,不需要名称 ...

  3. Scala高手实战****第20课:Scala提取器、注解深度实战详解及Spark源码鉴赏

    Spark中的源码的提取器和注解 @SparkContext.scala @ volatile 线程专用 保证线程间共享内容的一致性 @volatile private var _dagSchedul ...

  4. Scala实战高手****第13课:Scala模式匹配实战和Spark源码鉴赏

    package com.dt.spark.scala.bascis class Dataframework case class Computerframework (name:String,popu ...

  5. Scala高手实战****第19课:Scala的包、继承覆写及Spark源码鉴赏

    1.SparkSession.scala //导入某个类 import scala.beans.Introspector //导入某包下所有的类 import scala.beans._ //导入某包 ...

  6. Scala高手实战****第18课:Scala偏函数、异常、Lazy值编码实战及Spark源码鉴赏

    本篇文章主要讲述Scala函数式编程之偏函数,异常,及Lazy 第一部分:偏函数 偏函数:当函数有多个参数,而在使用该函数时不想提供所有参数(比如函数有3个参数),只提供0~2个参数,此时得到的函数便 ...

  7. Scala实战高手****第15课:Scala类型参数编程实战及Spark源码鉴赏

    1.Scala的类和方法.函数都可以是泛型 2.上界:表示泛型的类型必须是某种类型或者其类型的子类,语法:<: ,对类型进行限定 3.下界:表示泛型的类型必须是某种类型或者其类型的父类,语法:& ...

  8. Scala实战高手****第14课:Scala集合上的函数式编程实战及Spark源码鉴赏

    package com.dt.spark.scala.bascis object Functional_Itearal {   def main(args: Array[String]): Unit ...

  9. Scala实战高手****第11课:Scala面向接口彻底实战和Spark源码鉴赏

    第一点: scala的接口trait中所有方法可以都被实现!! 这种情况一般会是一种工具方法的集合,例如接口 Logging! scala 多种继承用extends ... with  .... 在老 ...

随机推荐

  1. 使用 FirewallD 构建动态防火墙

    使用 FirewallD 构建动态防火墙 FirewallD 提供了支持网络/防火墙区域(zone)定义网络链接以及接口安全等级的动态防火墙管理工具.它支持 IPv4, IPv6 防火墙设置以及以太网 ...

  2. [洛谷P1032] 字串变换

    洛谷题目链接:字串变换 题目描述 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在 A$中的子串 A1 可以变换为 B ...

  3. Intellij IDEA创建spring MVC项目

    相信各位未来的Java工程师已经接触到了spring MVC这个框架的强大之处,看了很多的教程,都是eclipse的,在intellij IDEA这个强大的工具面前居然不能很顺畅的,今天我就带领大家用 ...

  4. BZOJ1037 DP

    2013-11-15 21:51 原题传送门http://www.lydsy.com/JudgeOnline/problem.php?id=1037 拿到这道题想到了DP,后来发现三维无法确定的表示状 ...

  5. HDU1142 (Dijkstra+记忆化搜索)

    A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Jav ...

  6. Linux 的源码安装工具 CheckInstall

    Linux 的源码安装工具 CheckInstall Checkinstall 是一个能从 tar.gz 类的 https://www.ibm.com/developerworks/cn/linux/ ...

  7. servlet(1) - 手写第一个servlet程序 - 小易Java笔记

    声明:如tomcat的安装目录为D:\Java\tomcat6,下面要根据tomcat的安装目录而定 1. 建立程序的文件结构 ==>找到tomcat的安装目录,在webapps目录下新建一个名 ...

  8. mysql索引语法及示例

    注:本篇文章是对菜鸟教程中的mysql索引(http://www.runoob.com/mysql/mysql-index.html)的翻译版本:添加了示例,便于理解: 索引分单列索引和组合索引.单列 ...

  9. 5.flask知识点补充

    1.WTForms表单验证基本使用 flask-wtf是一个简化了WTForms操作的一个第三方库,WTForms表单的两个主要的功能jiushi就是验证用户提交数据的合法性以及渲染模板.当然还包括其 ...

  10. Solidity 文档--第三章:Solidity 编程实例

    Solidity 编程实例 Voting 投票 接下来的合约非常复杂,但展示了很多Solidity的特性.它实现了一个投票合约.当然,电子选举的主要问题是如何赋予投票权给准确的人,并防止操纵.我们不能 ...