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

一:隐式转换
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")))

  

最新文章

  1. 系列篇|编译可在Android上运行的依赖库(一):glib库
  2. yii2 控制器、方法命名规范和访问路由
  3. git中.gitignore配置项不起作用-解决办法
  4. 《BI那点儿事》数据仓库建模:星型模式、雪片模式
  5. 六个创建模式之单例模式(Singleton Pattern)
  6. VHDL TestBench基础(转)
  7. c\c++复习基础要点16----枚举类型
  8. DedeCMS官方手册
  9. 用VC实现竖写汉字的方法
  10. zoj3204 Connect them 最小生成树
  11. Spring学习一
  12. ST-LINK V2 DIY笔记(一)
  13. 微信小程序——demo合集及简单的文档解读【五】
  14. Java 终结方法 避免使用终结方法
  15. redis的主从服务器配置
  16. 利用tcp三次握手,使用awl伪装MAC地址进行多线程SYN洪水攻击
  17. 第一章 HTML+CSS(中)
  18. 使用python requests模块搭建http load压测环境
  19. Windows删除服务方法
  20. R.java的生成规则

热门文章

  1. tomcat发布web项目的三种方式
  2. Prepare and Deploy Windows Server 2016 Active Directory Federation Services
  3. C++开源库,欢迎补充。
  4. Java Web转发和重定向问题
  5. 转:增强学习(二)----- 马尔可夫决策过程MDP
  6. Python基础(8)迭代器、生成器
  7. 【洛谷 P1896】[SCOI2005]互不侵犯(状压dp)
  8. SAR图像处理 MSTAR数据库利用问题
  9. Golang在视频直播平台的高性能实践(含PPT下载)
  10. 百度面试题——top K算法