Types 如何在Julia中定义任何浮点类型的数组?

Types 如何在Julia中定义任何浮点类型的数组?,types,julia,Types,Julia,我尝试了Array{AbstractFloat,1},但这不适用于Array{Float64,1}如果您想要一个可以包含任何类型浮点值的向量,那么正确的类型是vector{AbstractFloat},它可以这样构造: julia> v = AbstractFloat[] AbstractFloat[] julia> push!(v, 1.5) 1-element Vector{AbstractFloat}: 1.5 julia> push!(v, big(2.0)^10

我尝试了
Array{AbstractFloat,1}
,但这不适用于
Array{Float64,1}如果您想要一个可以包含任何类型浮点值的向量,那么正确的类型是
vector{AbstractFloat}
,它可以这样构造:

julia> v = AbstractFloat[]
AbstractFloat[]

julia> push!(v, 1.5)
1-element Vector{AbstractFloat}:
 1.5

julia> push!(v, big(2.0)^1000)
2-element Vector{AbstractFloat}:
 1.5
 1.071508607186267320948425049060001810561404811705533607443750388370351051124936e+301

julia> map(typeof, v)
2-element Vector{DataType}:
 Float64
 BigFloat

julia> push!(v, "oy, I'm not a float!")
ERROR: MethodError: Cannot `convert` an object of type String to an object
正确的是,
Vector{Float64}
不是
Vector{AbstractFloat}
的子类型。这是因为Julia中参数类型的子类型是不变的(不是协变的,甚至不是逆变的)。更一般地说,没有具体类型是任何其他具体类型的子类型,
Vector{Float64}
Vector{AbstractFloat}
都是具体类型,因为它们是实际对象的类型:

julia> typeof(v)
Vector{AbstractFloat} = Array{AbstractFloat,1}

julia> typeof([1.5])
Vector{Float64} = Array{Float64,1}

如果您想要一个包含这两种具体类型以及任何其他浮点值向量的抽象类型,那么它可以表示为
vector{type
Array{AbstractFloat,1}
可以保存任何抽象浮点类型,您可以通过将不同的浮点类型推入其中进行验证。是否需要数组执行
数组{AbstractFloat,1}
类型无法执行的操作,或者您正在询问如何满足类型比较?
julia> Vector{AbstractFloat} <: Vector{<:AbstractFloat}
true

julia> Vector{Float64} <: Vector{<:AbstractFloat}
true

julia> Vector{Union{Float64, BigFloat}} <: Vector{<:AbstractFloat}
true

julia> Vector{String} <: Vector{<:AbstractFloat}
false
f(v::Vector{<:AbstractFloat}) = "a vector of floats"
f(v::Vector) = "a vector but not of floats"
f(x::Any) = "not a vector at all"
julia> f(v)
"a vector of floats"

julia> f([1.5])
"a vector of floats"

julia> f(Union{Float64,BigFloat}[1.5, big(2.0)])
"a vector of floats"

julia> f([1, 2, 3])
"a vector but not of floats"

julia> f("nope")
"not a vector at all"