zoukankan      html  css  js  c++  java
  • Scala 上下文界定

    上下文界定的类型参数形式为T:M的形式,其中M是一个泛型,这种形式要求存在一个M[T]类型的隐式值:

      /**
        * 上下文界定
        */
      @Test
      def testOrdering_Class_Context() = {
        class User(val userName: String, val age: Int)
    
        class UserOrderingObject extends Ordering[User] {
          override def compare(x: User, y: User): Int = x.age - y.age
        }
    
        class Pair[T: Ordering](val first: T, val second: T) {
          def smaller(implicit ord: Ordering[T]) = {
            if (ord.compare(first, second) > 0)
              second
            else
              first
          }
        }
    
        val u1 = new User("u1", 12)
        val u2 = new User("u2", 13)
        //提供隐式值,隐式值需要提供在创建Pair之前
        implicit val uo = new UserOrderingObject
        val p = new Pair(u1, u2)
    
        println(p.smaller.age)
    
    
      }
    
      /**
        * 上下文界定
        */
      @Test
      def testOrdering_Object_Context_1() = {
        class User(val userName: String, val age: Int)
    
        //TODO 隐式object伴生对象
        implicit object UserOrderingObject extends Ordering[User] {
          override def compare(x: User, y: User): Int = x.age - y.age
        }
    
        class Pair[T: Ordering](val first: T, val second: T) {
          def smaller() = {
            //TODO 获取隐式对象
            val ord = implicitly[Ordering[T]]
            if (ord.compare(first, second) > 0)
              second
            else
              first
          }
        }
    
        val u1 = new User("u1", 12)
        val u2 = new User("u2", 13)
        // 有隐式伴生对象不再需要提供隐式值
        val p = new Pair(u1, u2)
    
        println(p.smaller.age)
    
    
      }
    
    
      /**
        * 上下文界定
        */
      @Test
      def testOrdering_Object_Context_2() = {
        class User(val userName: String, val age: Int)
    
    
         object UserOrderingObject extends Ordering[User] {
          override def compare(x: User, y: User): Int = x.age - y.age
        }
    
        class Pair[T: Ordering](val first: T, val second: T) {
          def smaller() = {
    
            val ord = implicitly[Ordering[T]]
            if (ord.compare(first, second) > 0)
              second
            else
              first
          }
        }
    
        val u1 = new User("u1", 12)
        val u2 = new User("u2", 13)
        implicit val uo = UserOrderingObject
        val p = new Pair(u1, u2)
    
        println(p.smaller.age)
    
    
      }
  • 相关阅读:
    【疯狂积累CSS】1:CSS基础
    阿里云服务器配置小程序用ssl证书
    阿里云服务器申请ssl安全证书
    PDO连接SQLServer2008(linux和windows)
    win7 PHP7.0的PDO扩展
    Apache+php+mysql win7 64位安装的几个注意事项
    PHP配置xdebug
    PHPExcel导出
    【设计模式】命令模式
    【maven学习笔记】 01 初见
  • 原文地址:https://www.cnblogs.com/leodaxin/p/7534726.html
Copyright © 2011-2022 走看看