简介
Scala是一门多范式的编程语言,设计初衷是要整合面向对象编程和函数式编程的各种特性,Scala代码会被编译成.class并运行于JVM中。
Scala中存在非常复杂的类型系统,复杂程度不亚于C++。
型变
Scala中存在3中型变:协变(+)、逆变(-)、不变
- 协变:必须的数据类型为A或A的父类型,(+)可以想象成向上,积极的,可以传递A或及其以上类型
- 逆变:必须的数据类型为A或A的子类型,(-)可以想象成向下,消极的,可以传递A或及其以下类型
Scala中方法参数是逆变的,返回值是协变的
界定
Scala中存在3种界定:下界、上界、视图界定
- 下界(A >: B): 必须的数据类型为B或B的父类型
- 上界(A <: B): 必须的数据类型为B或B的子类型
- 视图界定(A <% B): 上下文中必须存在一个从A到B的隐式类型转换
类型约束
Scala中存在几种类型约束: =:=、<:<、<%<
- =:= 表示 A 必须是 B 类型
- <:< 表示 A 必须是B的子类型 (类似于简单类型约束 <:)
- <%< 表示 A 必须是可视化为 B类型, 可能通过隐式转换 (类似与简单类型约束 <%)
多重界定
- T:M:K 意味着在作用域中必须存在M[T]、K[T]类型的隐式值
- T<%M<%K 意味着在作用域中必须存在T到M、T到K的隐式转换
- K>:T<:M 意味着M是T类型的超类,K也是T类型的超类
在Scala中推荐将不带参数并且方法没有副作用(方法内部不会对外部的状态进行修改)的方法,在调用时省略括号。
Scala中缺省的泛型是非协变的。
Scala中的方法和函数属于两个不同的概念,方法无法作为参数进行传递,也无法赋值给变量,但是函数可以,但可以用_(下划线)来将方法转换为函数。
网友评论