Scala-隐式转换

这篇具有很好参考价值的文章主要介绍了Scala-隐式转换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

隐式转换

精度小的类型可以自动转换为精度大的类型,这个转换过程无需开发人员参与,由编译器自动完成,这个转换操作我们称之为隐式转换。

  • 如果程序编译出错,编译器会尝试在整个的作用域中查找能够让程序编译通过的方式
  • 如果找到,那么编译器会尝试二次编译,让之前编译出现错误的代码经过转换后能够编译通过。
  • 这个转换过程看不见,但是存在,就称之为隐式转换,所谓的隐式转换,其实就是类型的转换

隐式函数

object ScalaImplicit {
    def main(args: Array[String]): Unit = {
        implicit def transform( d : Double ): Int = {
            d.toInt
        }
        var d : Double = 2.0
        val i : Int = d
        println(i)
    }
}

隐式函数实现程序功能的扩展

符合OCP

    def main(args: Array[String]): Unit = {

        // 使用implicit声明的函数为隐式函数。
        implicit def thransform( user:User ): UserExt = {
            new UserExt()
        }

        val user = getUser()
        user.insertUser()
        user.updateUser()

    }
    class UserExt {
        def updateUser(): Unit = {
            println("update user...")
        }
    }
    class User {
        def insertUser(): Unit = {
            println("insert user...")
        }
    }
    def getUser() = {
        new User()
    }

隐式参数

def reg( implicit password : String = "000000" ): Unit = {
    println("默认密码:" + password)
}

隐式变量

  • 隐式参数不用传递,这个传递的过程由编译器完成
  • 在同一个作用域中,如果相同的转换规则的多个数据,会发生错误
implicit val password : String = "111111"
reg ==> 默认密码:111111

隐式类

在Scala2.10后提供了隐式类,可以使用implicit声明类,隐式类非常强大,同样可以扩展类的功能,在集合的数据处理中,隐式类发挥了重要的作用。

  • 其所带的构造参数有且只能有一个
  • 隐式类必须被定义在“类”或“伴生对象”或“包对象”里,即隐式类不能是顶级的。
def main(args: Array[String]): Unit = {
 	val user = new User()
    user.insertUser()
    user.updateUser()
}
implicit class UserExt(user:User) {
    def updateUser(): Unit = {
        println("update user...")
    }
}
class User {
    def insertUser(): Unit = {
        println("insert user...")
    }

隐式机制

  1. 当前代码作用域

    implicit class UserExt(user:User) {
        def updateUser(): Unit = {
            println("update user...")
        }
    }
    
  2. 父类或伴生对象

    class Parent {
        implicit class UserExt(user:User) {
            def updateUser(): Unit = {
                println("update user...")
            }
        }
    }
    object Parent {
        implicit class UserExt(user:User) {
            def updateUser(): Unit = {
                println("update user...")
            }
        }
    }
    
  3. 特征或伴生对象

    trait MyTrait {
        implicit class UserExt(user:User) {
            def updateUser(): Unit = {
                println("update user...")
            }
        }
    }
    object MyTrait {
        implicit class UserExt(user:User) {
            def updateUser(): Unit = {
                println("update user...")
            }
        }
    
  4. 在其他地方声明(包对象)

    package object chapter {
        implicit class UserExt(user:User) {
            def updateUser(): Unit = {
                println("update user...")
            }
        }
    }
    
  5. 直接导入文章来源地址https://www.toymoban.com/news/detail-807303.html

    import com.atguigu.bigdata.scala.test.TestTransform._
    

到了这里,关于Scala-隐式转换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JS隐式转换与类型比较

    隐式转换(Implicit Conversion)是指在表达式求值或操作中自动发生的类型转换。当使用不同的数据类型进行操作时,JavaScript 会自动进行类型转换以满足操作的要求。 隐式转换在编写逻辑时经常会出现,特别是在需要进行判断的逻辑场景中。举个例子: 需要注意的是,隐式转

    2024年02月07日
    浏览(30)
  • 『C语言进阶』隐式类型转换规则

    🔥 博客主页 : 小羊失眠啦. 🔖 系列专栏 : C语言 🌥️ 每日语录 : 但行前路,不负韶华! ❤️ 感谢大家点赞👍收藏⭐评论✍️ 今天小羊又来给铁汁们分享关于C语言的 隐式类型转换规则 ,在C语言中类型转换方式可分为 隐式类型转换 和 显式类型转换 (强制类型转换),

    2024年02月10日
    浏览(43)
  • 『C语言初阶』第八章 -隐式类型转换规则

    🔥 博客主页 : 小羊失眠啦. 🔖 系列专栏 : C语言 🌥️ 每日语录 : 但行前路,不负韶华! ❤️ 感谢大家点赞👍收藏⭐评论✍️ 今天小羊又来给铁汁们分享关于C语言的 隐式类型转换规则 ,在C语言中类型转换方式可分为 隐式类型转换 和 显式类型转换 (强制类型转换),

    2024年02月13日
    浏览(44)
  • 【C语言】你不知道的隐式类型转换规则

    🎈个人主页:库库的里昂 🎐CSDN新晋作者 🎉欢迎 👍点赞✍评论⭐收藏 ✨系列专栏C语言初阶、代码小游戏 🤝希望作者的文章能对你有所帮助,有不足的地方请在评论区留言指正,大家一起学习交流!🤗 【前言】 本文接着C语言中的操作符(万字详解)讲解隐式类型转换规

    2024年02月14日
    浏览(39)
  • 【c++】类和对象(六)深入了解隐式类型转换

    🔥个人主页 : Quitecoder 🔥 专栏 : c++笔记仓 朋友们大家好,本篇文章我们来到 初始化列表,隐式类型转换以及explicit的内容 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值 虽然上述构造函数调用之后,对象中已经有了一个初始值,但是

    2024年04月13日
    浏览(47)
  • Java核心知识点1-java和c++区别、隐式和显示类型转换

    java和c++区别 java通过虚拟机实现跨平台特性,但c++依赖于特定的平台。 java没有指针,它的引用可以理解为安全指针,而c++和c一样具有指针。 java支持自动垃圾回收,而c++需要手动回收。 java不支持多重继承,只能通过实现多个接口来达到相同目的,而c++支持多继承。  隐式(

    2024年02月03日
    浏览(46)
  • c++中static静态成员变量和静态成员函数、explcit和隐式类型转换、友元函数()详解

    声明为 static 的类成员 称为 类的静态成员 ,用 static 修饰的 成员变量 ,称之为 静态成员变量 ;用 static 修饰 的 成员函数 ,称之为 静态成员函数 。 静态成员变量一定要在类外进行初始化   静态成员 为 所有类对象所共享 ,不属于某个具体的对象,存放在静态区   静态成

    2024年02月04日
    浏览(49)
  • java数据类型的转换以及精度丢失

    float存储需求是4字节(32位), 其中1位最高位是符号位,中间8位表示阶位,后32位表示值 double存储需求是8字节(64为),其中1位最高位是符号位,中间11位表示阶位,后52位表示值 精度丢失就是我们的位数不够表示我们整个数值了 问题原因: 首先计算机进行的是二进制运算,

    2023年04月13日
    浏览(41)
  • Scala中的类型检查和转换,以及泛型,scala泛型的协变和逆变

    说明 (1) obj.isInstanceOf[T]:判断 obj 是不是T 类型。 (2) obj.asInstanceOf[T]:将 obj 强转成 T 类型。 (3) classOf 获取对象的类名。 案例 1.说明 (1)枚举类:需要继承 Enumeration (2)应用类:需要继承App 2. 案例 1.说明 使用 type 可以定义新的数据数据类型名称,本质上就

    2024年02月10日
    浏览(40)
  • 【C语言】表达式求值相关问题汇总—>隐式类型转换(整型提升)、算数转换与操作符优先级汇总(收藏查阅)

     👀 樊梓慕: 个人主页   🎥 个人专栏: 《C语言》《数据结构》《蓝桥杯试题》 🌝 每一个不曾起舞的日子,都是对生命的辜负。 目录 前言: 一、隐式类型转换 (一)整型提升的意义 (二)如何进行整型提升呢? 二、算数转换 三、操作符的属性 (一)操作符优先级汇

    2024年02月16日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包