`
zk_chs
  • 浏览: 214791 次
  • 性别: 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 Tutorial"可能是为初学者设计的,它通常会涵盖基础语法,如变量声明、数据类型、控制流结构、类与对象的定义,以及函数式编程的基础概念,如高阶函数和闭包。此外,教程可能还会介绍如何使用Scala的模式匹配...

    scala习题精选100道附带解析

    - **知识点概述**:Scala中的变量分为两种类型:不可变的val和可变的var。 - **详细解析**: - **val a = 3**:定义一个不可变变量a并赋值为3。 - **var b: Int = 3; b = 6**:定义一个可变变量b并赋值为3,然后...

    scala sdk scala-2.12.3

    7. **类型系统**:Scala拥有强大的类型系统,包括类型推断、模式匹配、高阶类型和抽象类型等,这使得编写安全且可维护的代码成为可能。 8. **面向对象编程**:Scala支持传统的类、继承、封装和多态性,同时也引入了...

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

    它可能涵盖了变量声明、基本数据类型、类与对象、模式匹配、高阶函数、类型系统、特质(trait)等主题,这些都是Scala编程的基石。此外,这本书还可能深入到Akka框架的介绍,因为Akka是Scala中用于构建分布式、反应...

    scala-2.10.4.rar

    3. **更好的类型推断(Improved Type Inference)**:通过增加`_`通配符和上下文界定(context bounds),使类型推断更加智能,减少了冗余的类型声明。 4. **并发和并行性增强(Concurrency and Parallelism ...

    Scala-变量

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

    scala入门精华讲义

    3. 隐式转换:Scala支持隐式转换,允许在特定上下文中将一个类型转换为另一个类型,提高代码的简洁性。 三、函数式编程概念 1. 高阶函数:如前所述,函数可以作为一等公民,可以赋值给变量、作为参数或返回结果。 ...

    Programming In Scala 中文版及英文版

    4. **类型推断**:Scala具有强大的类型推断能力,开发者在编写代码时可以省略许多类型声明,编译器会根据上下文自动推断出类型。 5. **集合库**:Scala的集合库是其强大特性之一,包含各种高效且功能丰富的集合,如...

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

    Scala中的变量有两种类型: `var` 和 `val`。 - **`var`**:可变变量,可以重新赋值。 - **`val`**:不可变变量,一旦赋值就不能更改。 示例: ```scala var x = 10 // 可变变量 val y = 20 // 不可变变量 ``` **2....

    Scala语言规范.pdf

    同时,局部类型是编译器根据上下文推断的类型,可以在不明确声明的情况下使用。 通过阅读《Scala语言规范》,开发者不仅可以掌握Scala的基础语法,还能了解到如何利用其高级特性来编写高效、可维护的代码。这对于...

    Scala语法简明教程

    - **静态类型语言**:Scala是一种静态类型的编程语言,这意味着类型检查在编译时进行,而不是在运行时。 - **面向对象+函数式编程**:Scala融合了面向对象编程和函数式编程的特性,支持类、对象和继承的同时也支持...

    scala3 scala3 scala3 scala3 scala3

    例如,`given` 关键字用于提供上下文实例,这在类型类和依赖类型推断中特别有用,使得代码更加简洁。 函数字面量的语法也得到了简化。在Scala3中,你可以使用单表达式函数,而无需使用`=&gt;`。例如,`x =&gt; x + 1` ...

    scala-2.12.10.zip

    对于Windows用户来说,这个安装包将简化Scala环境的搭建,包括安装JDK(因为Scala是基于JVM的),设置环境变量,并提供Scala命令行工具,如`scala`和`sbt`。 Scala的语法优雅且富有表达力,它允许开发者使用函数式...

    scala实战高清讲解

    - 函数:Scala将函数视为一等公民,可以作为变量赋值、作为参数传递和作为返回值。函数字面量和高阶函数是其重要特点。 - 语法:Scala的语法紧凑且富有表达力,例如模式匹配和for推导式。 2. **类型系统** - ...

    最好的scala学习 课件

    你会学习到Scala的语法结构,包括变量声明、常量、数据类型(如基本类型、引用类型、集合类型)、运算符、流程控制语句(如if-else、for循环、while循环)以及函数和方法的定义。此外,你还将了解Scala的模式匹配和...

    Scala考试题1

    - Scala 的模式匹配更强大,支持值匹配、类型匹配、提取器对象等,而 Java 的 switch-case 仅限于值比较。 14. **Scala 与 Java 的五点区别**: - Scala 支持函数式编程,Java 主要是面向对象。 - Scala 有更...

    scala-2.12.14.zip&scala-2.12.11.tgz Linux版本压缩包.rar

    1. **类型推断**:开发者无需为每条语句都指定类型,编译器可以根据上下文自动推断。 2. **模式匹配**:允许通过模式来解构复杂数据结构,简化代码并提高可读性。 3. **函数式编程**:支持高阶函数、柯里化、尾递归...

Global site tag (gtag.js) - Google Analytics