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

  1. Scala学习笔记--上界(<:)、视图界定(<%)、上下文界定(T:M)

    上界 下界 视界 object Test{ def main(args:Array[String]):Unit={ def mulBy(factor:Double)=(x:Double)=>fa ...

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

    17.1 泛型的基本介绍 17.1.1 基本介绍 1) 如果我们要求函数的参数可以接受任意类型,可以使用泛型,这个类型可以代表任意的数据类型 2) 例如List,在创建List时,可以传入整型.字符串 ...

  3. Scala 基础(十六):泛型、类型约束-上界(Upper Bounds)/下界(lower bounds)、视图界定(View bounds)、上下文界定(Context bounds)、协变、逆变和不变

    1 泛型 1)如果我们要求函数的参数可以接受任意类型.可以使用泛型,这个类型可以代表任意的数据类型. 2)例如 List,在创建 List 时,可以传入整型.字符串.浮点数等等任意类型.那是因为 Li ...

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

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

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

    今天学习了scala的多重界定 T >: A <: B 表示T同时有下界和下界,下界为A,上界为B,A为B的子类型.下界必须写在前面,上界必须写在后面,位置不能颠倒. T<:A wi ...

  6. Scala视图界定

    package big.data.analyse.dataSet /** * 视图界定 * Created by zhen on 2018/11/29. */ /*class Pair_NotPerf ...

  7. Scala 类型界定

    class User(val userName: String,val age: Int) extends Comparable[User] { override def compareTo(o: U ...

  8. Scala 深入浅出实战经典 第62讲:Scala中上下文界定内幕中的隐式参数实战详解

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt ...

  9. [Scala] 快学Scala A2L2

    集合 13.1 集合的三大类 所有的集合都扩展Iterable特质.集合的三大集合为Seq, Set, Map Seq是一个有先后次序的值的序列,比如数组或列表.IndexSeq允许我们通过整型下表快 ...

随机推荐

  1. InnoDB存储引擎--Innodb Buffer Pool(缓存池)

    InnoDB存储引擎--Innodb Buffer Pool(缓存池) Innodb Buffer Pool的概念 InnoDB的Buffer Pool主要用于缓存用户表和索引数据的数据页面.它是一块 ...

  2. 深入浅出 JVM GC(1)

    # 前言 初级 Java 程序员步入中级程序员的有一个无法绕过的阶段------GC(Garbage Collection).作为 Java 程序员,说实话,很幸福,不用像 C 程序员那样,时刻关心着 ...

  3. angularjs学习第六天笔记(指令简介学习)

    您好,由于周末有事情,没哟学习angularjs,几天晚上开始继续学习angularjs,坚持加油每一天.谢谢 接着上周五学习了表单验证以后,今天开始学习angularjs中一个非常重要的模块:指令 ...

  4. 通向全栈之路(6)—无密码ssh连接

    (1)在用户目录下新增一个 .ssh文件 mkdir .ssh (2)生成公钥.私钥 ssh-keygen -t rsa -b 4096 -C "mail@xxx.com" (3) ...

  5. CheckBox-复选框-删除-选中行

    <!--删除选中的行,利用oTable.deleteRow(i)方法--> <!DOCTYPE html> <html xmlns="http://www.w3 ...

  6. 【常用配置】Hadoop-2.6.5在Ubuntu14.04下的伪分布式配置

    core-site.xml <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet t ...

  7. C# Skip和Take的简单用法

  8. js keyup、keypress和keydown事件

    js keyup.keypress和keydown事件都是有关于键盘的事件 当一个按键被pressed 或released在每一个现代浏览器中,都可能有三种客户端事件. keydown event k ...

  9. Python 简单分页思路

    一: li = [] for i in range(1000): li.append(i) while True: p = input('input page: ') p = int(p) start ...

  10. jquery绑定点击事件的三种写法

    一.用jquery动态绑定点击事件的写法 部分代码: <script type="text/javascript"> $(document).ready(functio ...