# If parametric types are invariant, why is Vector{Int} a subtype of AbstractVector{Int}?

**URL:** <https://discourse.julialang.org/t/if-parametric-types-are-invariant-why-is-vector-int-a-subtype-of-abstractvector-int/53394>\
**Category:** General Usage\
**Tags:** question, parametric-types\
**Created:** [January 15, 2021, 5:40pm UTC](https://discourse.julialang.org/t/if-parametric-types-are-invariant-why-is-vector-int-a-subtype-of-abstractvector-int/53394 "2021-01-15T17:40:00Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![CameronBieganek](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/cameronbieganek/32/6915_2.png) [@CameronBieganek](https://discourse.julialang.org/u/CameronBieganek)\
**Post date:** [January 15, 2021, 5:40pm UTC](https://discourse.julialang.org/t/if-parametric-types-are-invariant-why-is-vector-int-a-subtype-of-abstractvector-int/53394/1 "2021-01-15T17:40:00Z")

</div>

If parametric types are invariant, why is `Vector{Int}` a subtype of `AbstractVector{Int}`?

```julia
julia> Vector{Int} <: AbstractVector{Int}
true

```

A somewhat more complete and self-contained example:

```julia
julia> abstract type Animal{T} end

julia> struct Cat{T} <: Animal{T} end

julia> Int <: Real
true

julia> Cat{Int} <: Animal{Real}
false

julia> Int <: Int
true

julia> Cat{Int} <: Animal{Int}
true

```

Since parametric types are supposed to be invariant, it seems like there should be no subtype relationship between `Cat{Int}` and `Animal{Int}`…

---

<div class="post-metadata">

**Author:** ![jling](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jling/32/212909_2.png) [@jling](https://discourse.julialang.org/u/jling)\
**Post date:** [January 15, 2021, 5:44pm UTC](https://discourse.julialang.org/t/if-parametric-types-are-invariant-why-is-vector-int-a-subtype-of-abstractvector-int/53394/2 "2021-01-15T17:44:33Z")

</div>

Your example is consistent with the first code block right? (this is not invariance or not, just abstract types mechanics)  
And also consistent examples:

```julia
julia> Vector{Int} <: AbstractVector{Real}
false

julia> AbstractVector{Int} <: AbstractVector{Real}
false

```

---

<div class="post-metadata">

**Author:** ![CameronBieganek](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/cameronbieganek/32/6915_2.png) [@CameronBieganek](https://discourse.julialang.org/u/CameronBieganek)\
**Post date:** [January 15, 2021, 5:49pm UTC](https://discourse.julialang.org/t/if-parametric-types-are-invariant-why-is-vector-int-a-subtype-of-abstractvector-int/53394/3 "2021-01-15T17:49:50Z")

</div>

Oh, right, I already forgot that type invariance means that  
`S <: T` does not imply `A{S} <: A{T}`.

Whereas my example is `B{T} <: A{T}`…

It still feels slightly inconsistent though… 🤔

---

<div class="post-metadata">

**Author:** ![Oscar\_Smith](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/oscar_smith/32/25343_2.png) [@Oscar\_Smith](https://discourse.julialang.org/u/Oscar_Smith)\
**Post date:** [January 15, 2021, 5:57pm UTC](https://discourse.julialang.org/t/if-parametric-types-are-invariant-why-is-vector-int-a-subtype-of-abstractvector-int/53394/4 "2021-01-15T17:57:15Z")

</div>

One way to think about it is that `Vector{Real}` is a concrete type while `AbstractVector{Int}` isn’t. As such `Vector{Real}` can’t be the supertype of anything, and `AbstractVector{Int}` can.

---

<div class="post-metadata">

**Author:** ![CameronBieganek](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/cameronbieganek/32/6915_2.png) [@CameronBieganek](https://discourse.julialang.org/u/CameronBieganek)\
**Post date:** [January 15, 2021, 6:01pm UTC](https://discourse.julialang.org/t/if-parametric-types-are-invariant-why-is-vector-int-a-subtype-of-abstractvector-int/53394/5 "2021-01-15T18:01:49Z")

</div>

That’s a good point. Since `AbstractVector{Int}` is an abstract type, there must be _something_ which is a subtype of it. Or rather, it must be possible for something to be a subtype of it.
