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

1、类型变量界定(Type Variable Bound):

  1. // 编译错误
  2. def typeVariable[T](a: T, b: T) = {
  3. if (a.compareTo(b) > 0) 1
  4. else -1
  5. }
  6. // 通过编译
  7. def typeVariable[T <: Comparable[T]](a: T, b: T) = {
  8. if (a.compareTo(b) > 0) 1
  9. else -1
  10. }

在上面的例子中,我们为范型T增加了约束,限定上界为Comparable[T],这样一来,范型类型T也就具有了Comparable[T]中的compareTo(T)方法,类似于java中的继承。

2、视图界定(View Bound):

  1. def typeVariable[T <: Comparable[T]](a: T, b: T) = {
  2. if (a.compareTo(b) > 0) 1
  3. else -1
  4. }

这是我们刚刚通过编译的代码,接着我们运行一下:

  1. val v1 = typeVariable("scala", "java")
  2. println(v1) // scala

运行结果为:scala,但是,如果我们输入数字的话,便会报错:

  1. val v2 = typeVariable(100, 200)
  2. println(v2)
  3. Error:(15, 12) inferred type arguments [Int] do not conform to method typeVariable's type parameter bounds [T <: Comparable[T]]
  4. val v2 = typeVariable(100, 200)
  5. ^

因为我们的Int类型并没有遵循我们的范型约束。如果我们此时想成功运行的话,就需要进行一次隐式转换,将Int类型转换成支持Comparable[T]的类型,那么,我们的视图界定便能出场了:

  1. def typeVariable[T <% Comparable[T]](a: T, b: T) = {
  2. if (a.compareTo(b) > 0) a
  3. else b
  4. }
  5. val v2 = typeVariable(100, 200)
  6. println(v2) // 200

从代码中发现,范型限定时,我们将"<:"改为了"<%",这样,原本的类型变量界定就转换成了视图界定,而视图界定帮我们进行了隐式转换,将Int转换成了支持Comparable[T]的RichInt类型。

编写代码时,"<%"的限定较为宽松,不仅继承了Comparable[T]的类能够顺利运行,而且通过隐式转换而来的继承Comparable[T]的类也能够顺利运行

3、上界(Upper Bound)、下界(Lower Bound):

有上界,那么也有下界,上界我们用"<:"来表示,例如:A <: B,表示B为A的上界,在java中即A继承B。

下界用">:"来表示,例如A >: B,表示B为A的下界,此时B继承A。

4、上下文界定(Context Bound):

上下文界定的类型参数形式为T:M的形式,其中M是一个泛型类,这种形式要求存在一个M[T]类型的隐式值:

  1. class Person(val age: Int) {
  2. println("person==> " + age)
  3. }
  4. // PersonOrdering继承了Ordering[T],而Ordering[T]又继承了Comporator[T],所以下面方法中有compare(x: T, y: T)方法
  5. class PersonOrdering extends Ordering[Person] {
  6. override def compare(x: Person, y: Person): Int = {
  7. if (x.age > y.age) 1 else -1
  8. }
  9. }
  10. // 该类定义了一个上下文界定,意思是
  11. // 在其作用域内,必须有一个Ordering[T]的隐式值,而这个隐式值可以作用于内部的方法
  12. class Pair[T: Ordering](val first: T, val second: T) {
  13. // 该方法需要一个类型为Ordering[T]的隐式参数
  14. def old(implicit ord: Ordering[T]) = {
  15. if (ord.compare(first, second) > 0) first else second
  16. }
  17. }
  18. // 定义一个隐式值,类型为Ordering[T]
  19. implicit val po = new PersonOrdering
  20. val p = new Pair(new Person(18), new Person(19))
  21. // 调用old方法时,不需要传入参数,根据我们的上下文界定要求,po满足要求,因此作为参数传入old
  22. println(p.old.age) // 19

这次的博客虽然是说界定,但是也扯到了不少的隐式转换,所以需要对scala有一些基本的了解,另外文章中如果有出错的地方,欢迎指正。

原文地址: http://zk-chs.iteye.com/blog/2292468

scala类型系统之: 类型变量界定、视图界定、上下文界定相关推荐

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

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

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

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

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

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

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

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

  5. Scala 上下文界定

    基本介绍 与 view bounds 一样 context bounds(上下文界定)也是隐式参数的语法糖. 为语法上的方便, 引入了"上下文界定"这个概念 就是设置一个隐式值,到 ...

  6. Scala类型系统的目的——Martin Odersky访谈(三)

    Martin Odersky向Frank Sommers和Bill Venners谈论Scala类型系统背后的设计动机. \\ Scala是一种新兴的通用用途.类型安全的Java平台语言,结合了面向对 ...

  7. Python 正则:前后界定和前后非界定

    在用正则去匹配识别手机号.QQ.微信号的时候,往往由于输入的文本可能非常的另类,比如,没有标点和隔断,这时`^`和`$`就用不上了. 不用其实也可以识别的,但是有个问题,手机后是11位数字,QQ是5~ ...

  8. Scala类型系统——高级类类型(higher-kinded types)

    高级类类型就是使用其他类型构造成为一个新的类型,因此也称为 类型构造器(type constructors).它的语法和高阶函数(higher-order functions)相似,高阶函数就是将其它 ...

  9. Scala类型系统(sudden thought)

    http://docs.scala-lang.org/tour/lower-type-bounds.html中有一段代码 trait Node[+B] {def prepend(elem: B): U ...

最新文章

  1. java timer.schedule如何控制执行次数_Java 分布式任务调度平台:PowerJob 快速开始+配置详解...
  2. 为什么 MySQL 的自增主键不单调也不连续
  3. SQL server 2000建立远程连接(局域网)
  4. 东平县农民丰收节-农业大健康·万祥军:功能性谋定生态品牌
  5. 说一下StoreBoard和纯代码编程各有什么好处吧
  6. [深度学习] 自然语言处理 --- Self-Attention(二) 动画与代码演示
  7. React 与 Vue 框架的设计思路大 PK
  8. applicationcontext添加配置_让小白也能懂的Bean配置方法
  9. Python库:Python OS库
  10. 【牛客-15121】Call to your teacher(并查集模板)
  11. 一个基于WinCE平台的语音识别例子,利用微软speechAPI5.0
  12. educoder Redis安全与性能
  13. Spark sql读取数据库和ES数据进行处理代码
  14. 视频流调试过程(海康威视+Kurento)
  15. 【笔记本触摸板失灵】终极解决办法
  16. Redis Cluster集群实验
  17. 线下WINDOWS主机挂载华为云存储
  18. 01.【入门必备】认识python-->Linux中python环境搭建-->Linux交互模式ipython
  19. 【Python自动化测试14】Python自动化测试基础与进阶练习题
  20. Java新生代垃圾收集器

热门文章

  1. SAP 上线前一些数据的重置和删除
  2. eNSP安装包以及镜像包(设备包)全集
  3. 关于矩阵自由度的解释
  4. 《Python Spark 2.0 Hadoop机器学习与大数据实战_林大贵(著)》pdf
  5. Git的具体使用,包括安装Git工具,把Git和IDEA结合,使用分支
  6. 初中学历零基础想转行Python,能否学会?Python难吗?
  7. 比较大小c语言 百度一下,百度部分笔试题3
  8. 车载智能终端TBOX
  9. C语言作业教师评语咋写,学生写给老师的评语4篇
  10. lol服务器维护得多长时间,lol维护时间