Scala类型系统

简介

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中的方法和函数属于两个不同的概念,方法无法作为参数进行传递,也无法赋值给变量,但是函数可以,但可以用_(下划线)来将方法转换为函数。

你可能感兴趣的:(Scala类型系统)