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)

  }
时间: 2024-10-12 19:22:19

Scala 上下文界定的相关文章

17. Scala泛型、上下界、视图界定、上下文界定

17.1 泛型的基本介绍 17.1.1 基本介绍 1) 如果我们要求函数的参数可以接受任意类型,可以使用泛型,这个类型可以代表任意的数据类型 2) 例如List,在创建List时,可以传入整型.字符串.浮点数等等任意类型.那是因为List在类定义时引用了泛型.比如在Java中:public interface List<E> extends Collection<E> 17.1.2 泛型的应用案例1 -要求 1) 编写一个Message类 2) 可以构建Int类型的Message,

scala多重界定

Scala 多重界定分为以下几种: 1.    T  <: A with   B    T是A或B的子类 2.    T  >: A with   B      A或B是T的子类   一般不用 3.    T  >:  A  <:    B       同时有上界和下界   A下是界,B是上界  ,A是B的子类 4.    T:A : B                上下文界定   T必须同时满足存在AT和BT的隐试转换值 5.  T <%  A <%    B   

Scala 深入浅出实战经典 第47讲:Scala多重界定代码实战及其在Spark中的应用

王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 腾讯微云:http://url.cn/TnGbdC 360云盘:http://yunpan.cn/cQ4c2UALDjSKy 访问密码 45e2 技术爱好者尤其是大数据爱好者 可以加DT大数据梦工厂的qq群 DT大数据梦工厂① :462923555 DT大数据梦工厂②:437123764 DT大数据梦工厂③

第47讲:Scala多重界定代码实战及其在Spark中的应用源码解析

今天学习了scala的多重界定 T >: A <: B 表示T同时有下界和下界,下界为A,上界为B,A为B的子类型.下界必须写在前面,上界必须写在后面,位置不能颠倒. T<:A with B T是A或B的子类. T>:A with B A或B是T的子类 T <% A <% B T同时满足能够即可以通过隐式转换转变为A的类型,也可以通过隐式转换变为B的类型. T : A : B T必须同时满足存在A[T]这种类型的隐式值和B[T]类型的隐式值. 分享下更多的scala资源

Scala 类型界定

class User(val userName: String,val age: Int) extends Comparable[User] { override def compareTo(o: User): Int = this.age - o.age } object OrderingDemo extends App { /** * 类型界定,上界 * * @param u1 * @param u2 * @tparam T T必须是Comparable[T]的子类 * @return */

[翻译]The Neophyte&#39;s Guide to Scala Part 12: Type Classes

The Neophyte's Guide to Scala Part 12: Type Classes 过去的两周我们讨论了一些使我们保持DRY和灵活性的函数式编程技术,特别是函数组合,partial function的应用,以及currying.接下来,我将会继续讨论如何使你的代码尽可能的灵活. 但是,这次我们将不会讨论怎么使用函数作为一等对象来达到这个目的,而是使用类型系统,这次它不是阻碍着我们,而是使得我们的代码更灵活:你将会学到关于 type classes 的知识. 你可能会觉得这是一

第45讲:Scala中Context Bounds代码实战及其在Spark中的应用源码解析

今天学业习了上下文界定的内容,看下这段代码 class Pair_Ordering[T:Ordering](val first : T,val second : T){  def bigger(implicit ordered:Ordering[T]) = {    if(ordered.compare(first, second) > 0) first else second  }} object Context_Bounds {    def main(args:Array[String])

Scala 深入浅出实战经典 第45讲: scala中context bounds代码实例

王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 腾讯微云:http://url.cn/TnGbdC 360云盘:http://yunpan.cn/cQ4c2UALDjSKy 访问密码 45e2 技术爱好者尤其是大数据爱好者 可以加DT大数据梦工厂的qq群 DT大数据梦工厂① :462923555 DT大数据梦工厂②:437123764 DT大数据梦工厂③

scala中的view bound与context bound

1.scala中的<%意识是“view bounds”(视界) ,它比<:的使用范围更广,还能进行隐式转换,是一种语法糖. 下面的两种写法是等效的,在编译之后完全一样. object Test { def main(args: Array[String]) { } def method1[A<% Int](a:Int): Unit ={ } def method2[A](a:Int)(implicit b:A=>Int): Unit ={ } } 其中的Function1的定义如下