为何整数元组与Int64元组匹配Tuple{Vararg{T}}时表现不同?
Julia类型系统疑问解析
差异原因
先拆解单个类型的判断逻辑:
Integer <: T where T <: Number返回true,是因为存在一个具体的T(比如T=Integer),既满足T是Number的子类型,又满足Integer是T的子类型。同理Int64 <: T where T <: Number也成立,T可以是Int64、Integer甚至Number本身。
而元组的情况核心在于参数化类型的约束范围:
Tuple{Vararg{T}} where T<:Number的意思是:存在某个固定的Number子类型T,元组里的所有元素都必须是这个T类型。比如它能匹配(1,2,3)::Tuple{Int64,Int64,Int64}(T=Int64),但匹配不了(1, UInt(2))::Tuple{Int64,UInt64}——因为不存在一个固定的T能同时覆盖Int64和UInt64。Tuple{Vararg{Integer}}表示元组的每个元素可以是任意Integer的子类型(不同元素可以是不同的Integer子类型),不存在一个固定的T能满足“所有元素都是T”,所以它不匹配Tuple{Vararg{T}} where T<:Number,返回false。Tuple{Vararg{Int64}}里所有元素都是固定的Int64类型,只要取T=Int64就满足约束,所以返回true。
替代写法
如果想要让Tuple{Vararg{Integer}}能匹配成功,不需要用where T<:Number的形式,直接写成:
Tuple{Vararg{<:Integer}}
或者如果一定要用where从句,可以写成:
Tuple{Vararg{S}} where S<:Integer
这两种写法都表示“元组的每个元素都是Integer的子类型(可以是不同子类型)”,正好匹配Tuple{Vararg{Integer}}的类型。
内容的提问来源于stack exchange,提问作者simon
相关产品推荐
相关产品推荐

