基本介绍

与 view bounds 一样 context bounds(上下文界定)也是隐式参数的语法糖。
为语法上的方便, 引入了”上下文界定”这个概念
就是设置一个隐式值,到时候会自动匹配

案例:
上下文界定应用实例
要求:使用上下文界定+隐式参数的方式,比较两个Person对象的年龄大小
要求:使用Ordering实现比较

代码:

package Contextboundsobject ContextBounds {//定义了一个隐式值  类型是:Ordering[Person]implicit val personComparetor = new Ordering[Person] {override def compare(p1: Person, p2: Person): Int =p1.age - p2.age}def main(args: Array[String]): Unit = {val p1 = new Person("mary", 30)val p2 = new Person("smith", 35)val compareComm1 = new CompareComm1(p1, p2)println(compareComm1.geatter)val compareComm2 = new CompareComm2(p1, p2)println(compareComm2.geatter)println("CompareComm3 comparetor:  " + personComparetor.hashCode())val compareComm3 = new CompareComm3(p1, p2)println(compareComm3.geatter)}
}//方式1
/*1.[T: Ordering]  泛型2.obj1: T, obj2: T  接受T 类型的参数3.implicit comparetor: Ordering[T]  隐式参数*/
class CompareComm1[T: Ordering](obj1: T, obj2: T)(implicit comparetor: Ordering[T]) {def geatter = if (comparetor.compare(obj1, obj2) > 0) obj1 else obj2
}//方式2,将隐式参数放到方法内
class CompareComm2[T: Ordering](o1: T, o2: T) {def geatter = {def f1(implicit cmptor: Ordering[T]) = cmptor.compare(o1, o2)if (f1 > 0) o1 else o2}
}//方式3,使用implicitly语法糖,最简单(推荐使用)
class CompareComm3[T: Ordering](o1: T, o2: T) {def geatter = {//这句话就是会发生隐式转换,获取到隐式值 personComparetorval comparetor = implicitly[Ordering[T]]println("CompareComm3 comparetor:  " + comparetor.hashCode())if (comparetor.compare(o1, o2) > 0) o1 else o2}
}//一个普通的Person类
class Person(val name: String, val age: Int) {override def toString = this.name + "\t" + this.age
}

我自己也听的稀里糊涂的,等过段时间需要用到上下文界定的时候再来完善

协变、逆变和不变

基本介绍

1)Scala的协变(+),逆变(-),协变covariant、逆变contravariant、不可变invariant

2)对于一个带类型参数的类型,比如 List[T],如果对A及其子类型B,满足 List[B]也符合List[A]的子类型,那么就称为covariance(协变) ,如果 List[A]是 List[B]的子类型,即与原来的父子关系正相反,则称为contravariance(逆变)。如果一个类型支持协变或逆变,则称这个类型为variance(翻译为可变的或变型),否则称为invariance(不可变的)
3)在Java里,泛型类型都是invariant(不可变),比如 List 并不是 List 的子类型。而scala支持,可以在定义类型时声明(用加号表示为协变,减号表示逆变),如: trait List[+T] // 在类型定义时声明为协变这样会把List[String]作为List[Any]的子类型。

协变:

逆变:

应用实例

在这里引入关于这个符号的说明,在声明Scala的泛型类型时,“+”表示协变,而“-”表示逆变
C[+T]:如果A是B的子类,那么C[A]是C[B]的子类,称为协变
C[-T]:如果A是B的子类,那么C[B]是C[A]的子类,称为逆变
C[T]:无论A和B是什么关系,C[A]和C[B]没有从属关系。称为不变.

Temp[Sub]和 Temp[Super] 之间没有从属关系,不变

协变:

逆变:

Scala 上下文界定相关推荐

  1. scala类型系统之: 类型变量界定、视图界定、上下文界定

    类型变量界定(Type Variable Bound).视图界定(View Bound).上下文界定(Context Bound),在scala中算很重要的内容了,这次博客就来写点自己的理解. 1.类 ...

  2. scala类型变量界定、视图界定、上下文界定

    类型变量界定(Type Variable Bound).视图界定(View Bound).上下文界定(Context Bound),在scala中算很重要的内容了,这次博客就来写点自己的理解. 1.类 ...

  3. Scala语言学习笔记——泛型、上下界、视图界定、上下文界定、协变逆变不变、闭包、柯里化

    1.Scala泛型 应用案例1 /*** @author huleikai* @create 2019-05-27 11:23*/ object TestFanXing {def main(args: ...

  4. 12:设计模式、泛型、上下界、视图界定、上下文界定、协变逆变不变

    经典的 WordCount 的讲解 示例代码如下: package com.atguigu.chapter14.homework.wordcount/*val lines = List("a ...

  5. 大数据技术之_16_Scala学习_12_设计模式+泛型、上下界、视图界定、上下文界定、协变逆变不变

    大数据技术之_16_Scala学习_12 第十七章 设计模式 17.1 学习设计模式的必要性 17.2 掌握设计模式的层次 17.3 设计模式的介绍 17.4 设计模式的类型 17.5 简单工厂模式( ...

  6. Scala入门到精通——第二十节 类型参数(二)

    本节主要内容 Ordering与Ordered特质 上下文界定(Context Bound) 多重界定 类型约束 1. Ordering与Ordered特质 在介绍上下文界定之前,我们对Scala中的 ...

  7. scala基础之泛型详解

    在Scala中你可以使用类型参数来实现类和函数,这样的类和函数可以用于多种类型.比如Array[T] 你可以存放任意指定类型T的数据. 类.特质.函数都可以有类型参数:将类型参数放在名字后面用方括号括 ...

  8. Scala 函数式编程

    一 函数式编程 1.1将函数值赋给变量 >>Scala中函数可以独立存在,不必像Java一样,还需要依附于类.而且我们可以直接将函数作为值赋给变量 >>Scala语法规定,将函 ...

  9. Scala中TypeTags和Manifests的用法

    Scala运行在JVM上,在JVM上有一种机制叫做类型擦除(type eraser).类型擦除是说:在语言的编译阶段程序中所携带的泛型信息都会被擦除,最终生成的class文件中是不包含类型信息的.所以 ...

最新文章

  1. 微生物组—宏基因组分析专题研讨会(线上课已开通,可以报名,线下课程时间待定)...
  2. python tuple类型和list_Python 04_List 和 Tuple 类型
  3. C# 调用颜色的RGB值_RGB颜色转换十六进制颜色
  4. hihoCoder1233(2015北京网络赛H题)
  5. C/C++关键字 static 和 const
  6. 沃尔玛建立自家的人工智能网络,抗衡竞争对手亚马逊
  7. 动态后台获取_后台管理系统的权限以及vue处理权限的思路
  8. mysql里面的页面筛选_【mysql】像很多网站(比如电商)里的筛选功能一般是如何实现的?...
  9. python基础逻辑判断语句(九)
  10. Oracle入门教程,新手必读
  11. mvc创建连接mysql_五、 创建连接串连接本地数据库(ASP.NET MVC5 系列)
  12. Jenkins使用FTP进行一键部署及回滚(Windows)
  13. linux网关管理,利用Linux打造安全的管理型网关
  14. c 调用java map_如何从C中的map迭代器调用类成员函数?
  15. python单位根检验看结果_求助!!!关于单位根检验!!!!我检验了,但看不懂结果,哪位高手帮帮忙...
  16. 开学季数码好物推荐,大学必备数码产品选购清单
  17. self-assessment
  18. Substrate 基础教程(Tutorials) -- 模拟网络 添加可信节点
  19. linux快速删除大量目录,Linux 快速删除大量小文件方法
  20. Pandas方法实践-2012美国总统竞选赞助数据分析

热门文章

  1. MySQL的MHA高可用配置及故障切换
  2. WannaCry——windows7补丁安装和下载地址
  3. 【开源项目推荐-ColugoMum】这群本科生基于国产深度学习框架PaddlePadddle开源了零售行业解决方案
  4. java.lang.IllegalStateException: getOutputStream() has already been ca...
  5. AIRPLAY镜像音频数据的处理
  6. Exiting on user Command
  7. 操作系统-------用P,V操作解决生产者和消费者问题(详解!!!)
  8. #1024程序员节#活动勋章获取方式
  9. 数字图像处理(3) — 基于白平衡的人脸美白算法
  10. QC新旧七图汇总连载9——亲和图