栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Scala隐式转换详解

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Scala隐式转换详解

隐式转换:

说明:可以动态扩展类的功能,当编译器第一次编译失败的时候,会在当前环境中查找能让编译通过的方法,该方法用于将类型进行转换,转换之后,进行二次编译,实现对类功能的扩展。

隐式函数:

说明:使用implicit关键字声明的函数称之为隐式函数

案例

代码说明:通过隐式转换为Int类型增加方法max和min

  //将Int数据类型,转换成WRichInt
  implicit def convert(a:Int)={
    new WRichInt(a)
  }
  def main(args: Array[String]): Unit = {
    println(2.wMax(5))
  }
}

class WRichInt(var self:Int){
  def wMax(i:Int):Int={
    if(self < i)
      i
    else
      self
  }
  def wMIn(i:Int):Int={
    if(self > i)
      i
    else
      self
  }
隐式参数:

说明:普通方法或者函数中的参数可以通过implicit关键字声明为隐式参数,调用该方法时,就可以传入该参数,编译器会在相应的作用域寻找符合条件的隐式值。

案例:

def main(args: Array[String]): Unit = {
    implicit var a:Int = 10
    def num(implicit x:Int):Int={
      x
    }
    println(num)
  }

在使用隐式参数时,调用函数不需要加(),同一个作用域中,相同类型的隐式值只能有一个,编译器按照隐式参数的类型去寻找对应类型的隐式值,与隐式值的名称无关。隐式参数优先于默认参数。

隐式类:

说明:其所带的构造参数有且只能有一个,隐式类必须被定义在“类”或“伴生对象”或“包对象”里,即隐式类不能是顶级的。
案例

 implicit class MyRichInt(arg: Int) {
    def myMax(i: Int): Int = {
      if (arg < i) i else arg
    }
    def myMin(i: Int) = {
      if (arg < i) arg else i
    }
  }

  def main(args: Array[String]): Unit = {
    println(1.myMax(3))
  }
隐式解析机制:

(1)首先会在当前代码作用域下查找隐式实体(隐式方法、隐式类、隐式对象)
(2)如果第一条规则查找隐式实体失败,会继续在隐式参数的类型的作用域里查找。类型的作用域是指与该类型相关联的全部伴生对象以及该类型所在包的包对象

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/631624.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号