上下文界定的类型参数形式为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. 内置函数二(lambda函数,sorted(),filter(),map(),递归函数,二分法查找)

    一,匿名函数 lambda表⽰示的是匿名函数. 不需要⽤用def来声明, ⼀一句句话就可以声明出⼀一个函数 语法:    函数名 = lambda 参数: 返回值 注意: 1. 函数的参数可以有多个. ...

  2. 数据库内连接GROUP BY查询外键表数据行的总数

    最近看了看SQL,刚好遇到这个问题. INNER JOIN [外键表] ON [主键表] 内链接,用 GROUP BY 分组外键数据,COUNT(*)计算该外键数据总行数,最后用 ORDER BY 排 ...

  3. MSSQL存储过程应用

    1.原始表inoutinfo 2.现在想输入时间范围和操作类型输出对应的结果 2.1创建存储过程 create proc selecttype@type nvarchar(10),@starttime ...

  4. Dependency Walker使用说明 转载

    转载地址:http://blog.csdn.net/swort_177/article/details/5426848?reload 在Windows世界中,有无数块活动的大陆,它们都有一个共同的名字 ...

  5. idea创建maven项目速度慢?别急,这有三种方案

    困扰 Intellij idea是一款非常强大的编辑器,可以很方便地帮我们创建maven项目,有用过的同学应该都深有体会,但我们经常会遇到一个困扰,那就是用idea创建maven项目时,速度很慢,往往 ...

  6. Spring源码分析之IoC容器初始化

    本文首发于cdream个人博客(点击获得更加阅读体验) 欢迎转载,转载请注明出处 作为一个java程序员,保守估计一年里也都有300天要和Spring有亲密接触~~像我这种怕是每天都要撸撸Spring ...

  7. html页面字体相关

    <!doctype html> <html> <head> <meta charset="utf-8"/> <title> ...

  8. 通过swagger将API业务版本号与Gitlab代码版本号绑定

    1.调用Gitlab API获取项目commit ID 2.编辑 Swagger2.java @Configuration @EnableSwagger2 @EnableWebMvc public c ...

  9. JavaScript中的window对象的属性和方法;JavaScript中如何选取文档元素

    一.window对象的属性和方法 ①setTimeout()方法用来实现一个函数在指定毫秒之后运行,该方法返回一个值,这个值可以传递给clearTimeout()用于取消这个函数的执行. ②setIn ...

  10. √n求单值欧拉函数

    基本定理: 首先看一下核心代码: 核心代码 原理解析: 当初我看不懂这段代码,主要有这么几个问题: 1.定理里面不是一开始写了一个n*xxx么?为什么代码里没有*n? 2.ans不是*(prime[i ...