首页 > 其他 > 详细

Scala 上下文界定

时间:2017-09-17 12:56:18      阅读:283      评论:0      收藏:0      [点我收藏+]

上下文界定的类型参数形式为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)


  }

 

Scala 上下文界定

原文:http://www.cnblogs.com/leodaxin/p/7534726.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!