# Parametric types help

This does work:

``````abstract type AbstractBar end

struct Foo{T <: Real,V <: AbstractBar}
bar::Vector{V}
t::Vector{T}
end

struct Bar <: AbstractBar
b::Float64
end

Foo{T}() where {T} = Foo{T,Bar}(Bar[], T[])
Foo() = Foo{Float64,Bar}(Bar[], Float64[])
``````
``````julia> Foo()
Foo{Float64,Bar}(Bar[], Float64[])

julia> Foo{Int64}()
Foo{Int64,Bar}(Bar[], Int64[])
``````

This does not work:

``````abstract type AbstractBar end

struct Foo{V <: AbstractBar, T <: Real}
bar::Vector{V}
t::Vector{T}
end

struct Bar <: AbstractBar
b::Float64
end

Foo{T}() where {T} = Foo{Bar,T}(Bar[], T[])
Foo() = Foo{Bar,Float64}(Bar[], Float64[])
``````
``````julia> Foo()
Foo{Bar,Float64}(Bar[], Float64[])

julia> Foo{Int64}()
ERROR: TypeError: in Foo, in V, expected V<:AbstractBar, got Type{Int64}
``````

What am I missing here?

You can’t re-order type parameters.

You can’t do this because `Foo{X}` is an abstract type `Foo{X,T}`:

``````julia> Foo{Bar}
Foo{Bar,T} where T<:Real
``````

So `Foo{Int}` will fail because your `Foo` type requires the first type parameter to be a subtype of `AbstractBar`.

1 Like