Julia类型联合,有时候,无论是类型的别称还是抽象都难以满足程序设计的需求。例如某个函数的参数,我们希望是Int64或Float32型,但不能是任何其他的类型。这样的要求,前面介绍的方式是难以实现的。
Julia中提供了一种可以将多种类型进行“或组合”的方式,即类型联合(Type Unions),定义的基本语法为:
Union{T1, T2, …}
其中,Union
会将大括号内以逗号分隔的多个类型进行组合,变成单一的类型。
例如,我们可以声明一个内部类型元素为Int64
与Float32
的类型联合,代码如下:
julia> IntOrFloat64 = Union{Int64, Float64}
Union{Float64, Int64}
julia> typeof(IntOrFloat64)
Union
此时对其进行相关类型的继承关系断言,便会发现除了Int64与Float64外,其他的类型都不是其子类型:
如此一来,便实现了对多个类型进行组合限定的目的。
在类型联合的基础上,我们便可用其限定具体值的类型,只有满足类型断言的对象才能够获得有效操作。例如:
其中,变量a因为类型是Int32,既不是Int64也不是Float64,所以会上报Type Error异常。
Union在元素类型上并没有过多限制,不仅适用于基本的类型,也适用于其他更多的类型。例如:
julia> MockType = Union{FooA, FooB, Integer};
其中,MockType
将复合类型与普通的抽象类型进行了联合,构造出了新的类型。将其与其他各种类型对比断言,便会发现其确实对元素中的类型有了准确的限定约束,代码如下所示:
julia> FooA <: MockType
true
julia> FooB <: MockType
true
julia> MockType >: Signed # 其中的Integer是Signed的父类型
true
julia> MockType >: AbstractFloat
false
julia> MockType >: Bar # Bar是前文曾声明过的复合类型
false
另外一个事实是,虽然类型联合的类型是Union而非是DataType,但Union的类型却是DataType,即:
julia> typeof(Union)
DataType
所以类型联合也是DataType的实例对象,同样也是类型系统的一部分。
但是,Union的直接父类型并非是Any类型,而是:
julia> supertype(Union)
Type{T}
其中,Type{T}
是一种特殊的参数化类型,将会在接下来的内容中进行介绍。
酷客网相关文章:
评论前必须登录!
注册