类型变量界定(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有一些基本的了解,另外文章中如果有出错的地方,欢迎指正。
相关推荐
Scala概述.pptx 变量.pptx 运算符.pptx 程序流程控制.pptx 函数式编程基础.pptx 面向对象编程(基础部分).pptx ...泛型 上下界 视图界定 上下文界定 协变逆变不变.pptx AKKA.pptx 韩顺平_Scala语言核心编程.pdf
例如,`given` 关键字用于提供上下文实例,这在类型类和依赖类型推断中特别有用,使得代码更加简洁。 函数字面量的语法也得到了简化。在Scala3中,你可以使用单表达式函数,而无需使用`=>`。例如,`x => x + 1` ...
Scala类型参数.md
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 Tutorial"可能是为初学者设计的,它通常会涵盖基础语法,如变量声明、数据类型、控制流结构、类与对象的定义,以及函数式编程的基础概念,如高阶函数和闭包。此外,教程可能还会介绍如何使用Scala的模式匹配...
7. **类型系统**:Scala拥有强大的类型系统,包括类型推断、模式匹配、高阶类型和抽象类型等,这使得编写安全且可维护的代码成为可能。 8. **面向对象编程**:Scala支持传统的类、继承、封装和多态性,同时也引入了...
它可能涵盖了变量声明、基本数据类型、类与对象、模式匹配、高阶函数、类型系统、特质(trait)等主题,这些都是Scala编程的基石。此外,这本书还可能深入到Akka框架的介绍,因为Akka是Scala中用于构建分布式、反应...
3. **更好的类型推断(Improved Type Inference)**:通过增加`_`通配符和上下文界定(context bounds),使类型推断更加智能,减少了冗余的类型声明。 4. **并发和并行性增强(Concurrency and Parallelism ...
Scala语言定义变量 定义变量 Scala中可以使用val或者var来定义变量。 语法格式: val/var 变量标识:变量类型 = 初始值 val定义的是不可重新赋值的变量 var定义的是可重新赋值的变量 代码演示: 定义一个变量保存一个...
- **知识点概述**:Scala中的变量分为两种类型:不可变的val和可变的var。 - **详细解析**: - **val a = 3**:定义一个不可变变量a并赋值为3。 - **var b: Int = 3; b = 6**:定义一个可变变量b并赋值为3,然后...
3. 隐式转换:Scala支持隐式转换,允许在特定上下文中将一个类型转换为另一个类型,提高代码的简洁性。 三、函数式编程概念 1. 高阶函数:如前所述,函数可以作为一等公民,可以赋值给变量、作为参数或返回结果。 ...
用户只需解压文件,然后配置系统环境变量,使系统能够找到Scala的bin目录,从而可以执行`scala`和`scalac`等命令。 配置环境变量是使用免安装版Scala的关键步骤。以下是一般步骤: 1. **添加Scala bin目录到PATH...
4. **类型推断**:Scala具有强大的类型推断能力,开发者在编写代码时可以省略许多类型声明,编译器会根据上下文自动推断出类型。 5. **集合库**:Scala的集合库是其强大特性之一,包含各种高效且功能丰富的集合,如...
Scala中的变量有两种类型: `var` 和 `val`。 - **`var`**:可变变量,可以重新赋值。 - **`val`**:不可变变量,一旦赋值就不能更改。 示例: ```scala var x = 10 // 可变变量 val y = 20 // 不可变变量 ``` **2....
同时,局部类型是编译器根据上下文推断的类型,可以在不明确声明的情况下使用。 通过阅读《Scala语言规范》,开发者不仅可以掌握Scala的基础语法,还能了解到如何利用其高级特性来编写高效、可维护的代码。这对于...
- **静态类型语言**:Scala是一种静态类型的编程语言,这意味着类型检查在编译时进行,而不是在运行时。 - **面向对象+函数式编程**:Scala融合了面向对象编程和函数式编程的特性,支持类、对象和继承的同时也支持...
对于Windows用户来说,这个安装包将简化Scala环境的搭建,包括安装JDK(因为Scala是基于JVM的),设置环境变量,并提供Scala命令行工具,如`scala`和`sbt`。 Scala的语法优雅且富有表达力,它允许开发者使用函数式...
- Scala 的模式匹配更强大,支持值匹配、类型匹配、提取器对象等,而 Java 的 switch-case 仅限于值比较。 14. **Scala 与 Java 的五点区别**: - Scala 支持函数式编程,Java 主要是面向对象。 - Scala 有更...
- 函数:Scala将函数视为一等公民,可以作为变量赋值、作为参数传递和作为返回值。函数字面量和高阶函数是其重要特点。 - 语法:Scala的语法紧凑且富有表达力,例如模式匹配和for推导式。 2. **类型系统** - ...
你会学习到Scala的语法结构,包括变量声明、常量、数据类型(如基本类型、引用类型、集合类型)、运算符、流程控制语句(如if-else、for循环、while循环)以及函数和方法的定义。此外,你还将了解Scala的模式匹配和...