Julia中如何定义含AbstractVector类型Element集合的Mesh参数化结构体
Julia参数化结构体定义问题解决
你想要定义一个Mesh结构体,其中elements字段是存储Element实例的类向量类型,希望用参数化类型兼容普通向量、静态向量等AbstractVector的子类型,但尝试的代码报错:
ERROR: TypeError: in Type{...} expression, expected UnionAll, got a value of type TypeVar
报错代码:
struct Element value end struct Mesh{T :< AbstractVector} elements::T{Element} end
错误原因
T :< AbstractVector约束的是T为AbstractVector的子类型,但AbstractVector本身是带元素类型参数的UnionAll类型(比如AbstractVector{E})。你试图用T{Element}来指定元素类型,但此时T可能是一个具体的类型(比如Vector是UnionAll,但如果T绑定到具体的Vector{Int}就不是了),无法再用类型构造器去构造,因此触发错误。
正确写法
写法一:直接约束T为存储Element的向量类型
这种写法最贴合你的需求,明确限定T是AbstractVector{Element}的子类型,字段直接使用T类型:
struct Element value end struct Mesh{T <: AbstractVector{Element}} elements::T end
这样Mesh可以接受任何存储Element的向量类型,比如Vector{Element}、StaticArrays.SVector{3, Element}等。
写法二:更通用的参数化(可扩展元素类型)
如果以后需要让Mesh支持存储其他类型元素,可以把元素类型也作为参数:
struct Element value end struct Mesh{E, V <: AbstractVector{E}} elements::V end
此时Mesh{Element, Vector{Element}}就是存储普通Element向量的结构体,也可以灵活替换为其他元素类型和向量类型。
内容的提问来源于stack exchange,提问作者Jared
相关产品推荐
相关产品推荐

