码迷,mamicode.com
首页 > 其他好文 > 详细

Scala 上下文界定

时间:2017-09-17 13:25:09      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:cond   blog   imp   extends   use   bsp   nbsp   class   def   

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

标签:cond   blog   imp   extends   use   bsp   nbsp   class   def   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!