zoukankan      html  css  js  c++  java
  • Scala(十)隐式转换

    10.1 隐式函数

      1隐式转换可以在不需改任何代码的情况下,扩展某个类的功能。

      2案例实操

        需求:通过隐式转化为Int类型增加方法。

    package com.yuange.scala.day06
    
    class MyRichInt(val self: Int){
      def myMax(i: Int): Int = {
        if (self < i) i else self
      }
    
      def myMin(i: Int): Int = {
        if (self < i) self else i
      }
    }
    
    object TestImplicitFunction {
      implicit def test(a: Int): MyRichInt = {
        new MyRichInt(a)
      }
    
      def main(args: Array[String]): Unit = {
        println(2.myMax(6))
      }
    }

    10.2 隐式参数

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

      1说明

        (1)同一个作用域中,相同类型的隐式值只能有一个

        (2)编译器按照隐式参数的类型去寻找对应类型的隐式值,与隐式值的名称无关。

        (3)隐式参数优先于默认参数

      2案例实操

    package com.yuange.scala.day06
    
    object TestImplicitParameter {
      implicit val name: String = "张三19岁了"
    
      def getName(implicit age: String="我今年18岁"): Unit = {
        println("age=" + age)
      }
    
      def main(args: Array[String]): Unit = {
        getName
      }
    }

    10.3 隐式类

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

      1隐式类说明

        (1)其所带的构造参数有且只能有一个

        (2)隐式类必须被定义在“类”或“伴生对象”或“包对象”里,即隐式类不能是顶级的

      2案例实操

    package com.yuange.scala.day06
    
    object TestImplicitClass {
      implicit class MyRichInt(a: Int){
        def myMax(i: Int): Int = {
          if (a < i) i else a
        }
    
        def myMin(i: Int): Int = {
          if (a < i) a else i
        }
      }
    
      def main(args: Array[String]): Unit = {
        println(1.myMax(5))
      }
    }

    10.4 隐式解析机制

      1说明

        (1)首先会在当前代码作用域下查找隐式实体(隐式方法、隐式类、隐式对象)。(一般是这种情况)

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

      2)案例实操

    package com.yuange.scala.day06
    
    import com.yuange.scala.day06.TestTransform.User
    
    trait PersonTrait{
    
    }
    
    object PersonTrait{
      implicit class Person(user: User){
        def say(): Unit = {
          println("说话...")
        }
      }
    }
    
    object TestTransform extends PersonTrait {
      def main(args: Array[String]): Unit = {
        //首先会在当前代码作用域下查找隐式实体
        val user = new User()
        user.eat()
        user.say()
      }
    
      class User{
        def eat(): Unit = {
          println("干粉干饭")
        }
      }
    }

  • 相关阅读:
    vue 客户端渲染和服务端渲染
    js 数组对象深拷贝
    vue template标签
    vue watch的高级用法
    js对象数组去重
    移动端触发touchend后阻止click事件
    重读JS(四)数据类型、作用域和内存问题
    重读JS(三)基本概念
    vue项目
    [vue问题解决]vue <router-link>在浏览器上点击失效(路由不跳转)
  • 原文地址:https://www.cnblogs.com/LzMingYueShanPao/p/14809548.html
Copyright © 2011-2022 走看看