# Parametric type of parametric type

hi,

how could I define a parametric type of a parametric type, like this:

``````julia> struct AA{T <: AbstractMatrix{S <: Number} }
data::T
end
ERROR: UndefVarError: S not defined
Stacktrace:
 top-level scope at none:0
``````

thanks.

You need S to be a parameter of the type as well:

``````struct AA{S, T <: AbstractMatrix{S}}
...
``````
3 Likes

You can also use a UnionAll constraint:

``````julia> struct AA{T <: AbstractMatrix{<:Number} }
data::T
end
``````
2 Likes

how do you call it as a “UnionAll” constraint?

`struct AA{T <: AbstractMatrix{<:Number} }`

I’m not quite sure what you mean. My suggestion is syntactic sugar for

``````julia> struct AA{T <: AbstractMatrix{T} where T<:Number }
data::T
end
``````

and the constructor just works:

``````julia> AA([1 2;1 2])
AA{Array{Int64,2}}([1 2; 1 2])
``````

The trick is also useful for method defintions:

``````f(x::Matrix{<:Number}) = ...
``````

``````f(x::Matrix{T} where  T<:Number) = ...
``````
1 Like

maybe it’s more clear to write as the following?

``````struct BB{S <: AbstractMatrix{T} where T<:Number }
data::S
end
``````

If you don’t need the inner type `T<:Number` within the definition of the `struct`, what @mauro3 suggests is more concise

2 Likes