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)


  }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM