我们已经知道,Array
是一个参数化类型,它的全名是Array{T,N}
。其中的类型参数T
用于确定数组的元素类型,而类型参数N
则用于确定数组的维数。这里的的取值通常是一个正整数(也可以是0
,表示零维数组)。并且,在 64 位的计算机系统中,它的值不能超出Int64
类型所能表示的数值范围;在 32 位的计算机系统中,它的值不能超出Int32
类型所能表示的数值范围。下面是一些示例:
在一般情况下,我们直接使用的数组的维数都不会太多,大多在三维及以下。尽管在一些程序中可能会用到拥有更多维度的数组,但其维数肯定也比Int32
类型所能表示的最大值要小得多。所以,这里的类型参数N
的取值范围对于我们来说相当于没有限制。
顺便说一下,我们在本书中不会专门去讨论相关的数学知识。但是,我们有时候(尤其是讲数组的时候)却不得不提到一点,因为有些对象及其操作基于的正是那些数学概念。不过别担心,我会尽量用精炼、朴实的语言去描述它们。
我们再来说数组类型的其他特点。与元组类型不同,数组类型的字面量永远也无法体现出元素的顺序。这主要是因为数组类型中只有一个可以代表元素类型的参数。想想看,如果一个元组类型的所有参数值全都相同,那么它同样无法体现出元素的顺序。
然而,对于多维数组来说,其各个维度上的元素数量却不是随意的。更确切地说,在一个多维数组中,处在同一个维度上的所有低维数组(即维数更低的数组)都应该具有相同的尺寸。这就好比一个方阵,其中的所有纵队的长度都需要相同。又好比一个六面体,它的每一个面都应该是平面,既不能有任何的凹陷,也不能有任何的凸出。只有符合这种规则的数组才能被称为多维数组,其类型如Array{Int64,2}
。否则,那个数组就只能算是多个数组的嵌套而已,其类型如Array{Array{Int64,1},1}
。
除了类型字面量上的一些特点,数组类型还具有非转化的特性。因此,[]
和[1]
虽然同为一维数组,但是它们的类型之间却不存在继承关系。这是由于空数组[]
的类型是Array{Any,1}
,它不是的超类型。验证的代码如下:
最后,再次强调,数组类型具有非转化的特性。