<
Scala 类型系统02:抽象类型
>
上一篇

Scala 类型系统03:自类型标记与结构化类型
下一篇

Scala 类型系统01:从参数化类型讲起

参数化类型在静态的,面向对象的语言中很常见。除了参数化类型,Scala 还支持抽象类型,这在函数式语言中很常见。

// 抽象类型用 type 关键字声明
trait exampleTrait {
  type t1               // 一个普通的没有约束的抽象类型
  type t2 >: t3 <: t1   // t2 必须是 t3 的父类,t1 的子类
  type t3 <: t1         // t3 必须是 t1 的子类
  type t4 <: Seq[t1]    // t4 必须是元素为 t1 的序列的子类
  // type t5 = +AnyRef  // ❌错误 不能在此使用变异标记
  
  val v1: t1  // t1 定义后才能初始化
  val v2: t2  // 同上
 	...
}

这里声明了 t1,t2,t3 的关系:

定义一些 trait 和一个类来测试一下这些类型:

trait T1 { val name1: String }
trait T2 extends T1 { val name2: String }
case class C(name1: String, name2: String) extends T2

最后,我们可以定义一个具体类型,定义抽象类型成员,并初始化相应的值:

object example extends exampleTrait {
  type t1 = T1
  type t2 = T2
  type t3 = C
  type t4 = Vector[T1]
  
  val v1 = new T1 { val name1 = "T1"}
  val v2 = new T2 { val name1 = "T1"; val name2 = "T2"
  val v3 = C("1", "2")
  val v4 = Vector(C("3", "4"))
}

什么时候使用何种类型

从技术上讲,参数化类型和抽象类型之间可以相互替换,你可以用参数化类型表示任意抽象类型,反之亦然。然而在事件中,不同的特征适合处理不同的设计问题。

Top
Foot