`
zk_chs
  • 浏览: 213482 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

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

阅读更多

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

 

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

// 编译错误
def typeVariable[T](a: T, b: T) = {
    if (a.compareTo(b) > 0) 1
    else -1
}

// 通过编译
def typeVariable[T <: Comparable[T]](a: T, b: T) = {
    if (a.compareTo(b) > 0) 1
    else -1
}

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

 

2、视图界定(View Bound):

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

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

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

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

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

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

def typeVariable[T <% Comparable[T]](a: T, b: T) = {
    if (a.compareTo(b) > 0) a
    else b
}
val v2 = typeVariable(100, 200)
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]类型的隐式值:

class Person(val age: Int) {
    println("person==> " + age)
}

// PersonOrdering继承了Ordering[T],而Ordering[T]又继承了Comporator[T],所以下面方法中有compare(x: T, y: T)方法
class PersonOrdering extends Ordering[Person] {
  override def compare(x: Person, y: Person): Int = {
    if (x.age > y.age) 1 else -1
  }
}

// 该类定义了一个上下文界定,意思是
// 在其作用域内,必须有一个Ordering[T]的隐式值,而这个隐式值可以作用于内部的方法
class Pair[T: Ordering](val first: T, val second: T) {
  // 该方法需要一个类型为Ordering[T]的隐式参数
  def old(implicit ord: Ordering[T]) = {
    if (ord.compare(first, second) > 0) first else second
  }
}

// 定义一个隐式值,类型为Ordering[T]
implicit val po = new PersonOrdering
val p = new Pair(new Person(18), new Person(19))
// 调用old方法时,不需要传入参数,根据我们的上下文界定要求,po满足要求,因此作为参数传入old
println(p.old.age) // 19

 

 

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

 

0
6
分享到:
评论

相关推荐

    scala课件.zip

    Scala概述.pptx 变量.pptx 运算符.pptx 程序流程控制.pptx 函数式编程基础.pptx 面向对象编程(基础部分).pptx ...泛型 上下界 视图界定 上下文界定 协变逆变不变.pptx AKKA.pptx 韩顺平_Scala语言核心编程.pdf

    Scala类型参数.md

    Scala类型参数.md

    快学 scala 中文版 带完整目录

    18.3 类型变量界定 298 18.4 视图界定 300 18.5 上下文界定 301 18.6 ClassTag上下文界定 301 18.7 多重界定 302 18.8 类型约束 L3302 18.9 型变 304 18.10 协变和逆变点 305 18.11 对象不能泛型 307 18.12...

    Scala-变量

    Scala语言定义变量 定义变量 Scala中可以使用val或者var来定义变量。 语法格式: val/var 变量标识:变量类型 = 初始值 val定义的是不可重新赋值的变量 var定义的是可重新赋值的变量 代码演示: 定义一个变量保存一个...

    Scala程序设计(第2版)

    5.2.1 执行上下文 115 5.2.2 功能控制 115 5.2.3 限定可用实例 116 5.2.4 隐式证据 120 5.2.5 绕开类型擦除带来的限制 122 5.2.6 改善报错信息 124 5.2.7 虚类型 124 5.2.8 隐式参数遵循的...

    scala习题精选100道附带解析

    scala习题精选100道,每道都有人工分析,技术点原理,不只是简单的答案

    快学Scala完整版&Scala编程(中文版)&Scala程序设计-多线程编程实践

    快学Scala完整版,Scala编程(中文版)&Scala程序设计-多线程编程实践,非常清晰,适合阅读

    scala sdk scala-2.12.3

    scala-2.12.3 scala-2.12.3 scala-2.12.3 scala-2.12.3

    Scala集合类型.md

    Scala集合类型.md

    Scala 数据类型 图表VISIO格式

    Scala 数据类型

    scala-sbt-scala编译工具

    scala 编译工具 sbt 安装包。 Little or no configuration required for simple projects Scala-based build definition that can use the full flexibility of Scala code Accurate incremental recompilation ...

    spark--Scala安装、变量、运算符.docx

    spark--Scala安装、变量、运算符讲解、过程、案例

    scala2.12.1Windows镜像包

    scala2.12.1Windows镜像包

    scala3 scala3 scala3 scala3 scala3

    scala3 scala3 scala3 scala3 scala3

    scala变量

    Scala变量使用说明 变量声明基本语法 注意事项 数据类型 scala数据类型体系 scala数据类型列表 整数类型: 浮点型 字符类型(Char)  布尔类型 Unit类型、Null类型和Nothing类型 值类型转换 标识符的命名规范 标识符...

    Scala编程实战.zip

    此文档是讲解实战Scala,希望对喜欢大数据的同学有所帮助!!! 学习Scala语言,不仅仅意味着熟悉新的API,更重要的是一种思维方式的转变。从原有的面向对象编程(OO)到函数式编程(FP)的思想。本书面向实际的使用场景...

    scala-2.10.6.msi scala在Windows平台上安装包

    scala-2.10.6.msi,Windows平台上安装包,亲测可用。 搭建spark环境需要scala环境,从外网拉下来的,速度很慢,共享出来方便大家。

    scala编程中文pdf

    scala编程 33章 中文pdf Scala编程实战 目录 第1章字符串. 11 第2章数值39 第3章控制结构.60 第4章类和属性.103 第5章方法147 第6章对象170 第7章包和导入.190 第8章特质200 第9章函数式编程214 第10 章集合242 第...

    scala 2.13.3 API 文档 Html离线版 scala-api.rar

    最新制作 scala 2.13.3 API 文档 Html离线版 Scala 是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。...Scala 运行在 Java 虚拟机上,并兼容现有的 Java 程序。

Global site tag (gtag.js) - Google Analytics