我试图了解 Julia 类型图中数组的结构。这对我来说似乎非常违反直觉:
julia> Int64 <: Number
true
julia> Array{Int64,1} <: Array{Number,1}
false
julia> Array{Int64,1} <: Array{Int,1}
true
Run Code Online (Sandbox Code Playgroud)
似乎a <: b还不够Array{a,1} <: Array{b,1}。什么时候 Array{a,1} <: Array{b,1}?
一个实用的推论:我如何类型声明一个抽象的数字数组?
在手册的下一页中,描述了 julia 的类型如何是不变的,而不是协变的。 https://docs.julialang.org/en/v1/manual/types/#Parametric-Composite-Types-1
请特别参阅警告提示,说明
最后一点非常重要:即使 Float64 <: Real 我们也没有 Point{Float64} <: Point{Real}。
并给出以下解释
换句话说,用类型论的说法,Julia 的类型参数是不变的,而不是协变的(甚至是逆变的)。这是出于实际原因:虽然 Point{Float64} 的任何实例在概念上也可能类似于 Point{Real} 的实例,但这两种类型在内存中具有不同的表示形式:
Point{Float64} 的实例可以简洁有效地表示为一对 64 位值的立即数;
Point{Real} 的实例必须能够保存任何一对 Real 实例。由于作为 Real 实例的对象可以具有任意大小和结构,因此在实践中 Point{Real} 的实例必须表示为一对指向单独分配的 Real 对象的指针。
具有任何类型数字的抽象数组表示如下
AbstractArray{<:Number},它是AbstractArray{T} where T <: Number