# Subtyping with Parametric Abstract Types

**URL:** <https://discourse.julialang.org/t/subtyping-with-parametric-abstract-types/34314>\
**Category:** General Usage\
**Created:** [February 7, 2020, 5:51pm UTC](https://discourse.julialang.org/t/subtyping-with-parametric-abstract-types/34314 "2020-02-07T17:51:30Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![HenriDeh](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/henrideh/32/8316_2.png) [@HenriDeh](https://discourse.julialang.org/u/HenriDeh)\
**Post date:** [February 7, 2020, 5:51pm UTC](https://discourse.julialang.org/t/subtyping-with-parametric-abstract-types/34314/1 "2020-02-07T17:51:30Z")

</div>

I don’t understand why

```julia
struct MultiDist{D <: UnivariateDistribution{S <: ValueSupport}} <: MultivariateDistribution{S <: ValueSupport}
    dist::D
    n::Int
end

```

returns that S in undefined. I also tried

```julia
struct MultiDist{D <: UnivariateDistribution{S}} <: MultivariateDistribution{S} where S <: ValueSupport
    dist::D
    n::Int
end

```

---

<div class="post-metadata">

**Author:** ![pbayer](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/pbayer/32/11675_2.png) [@pbayer](https://discourse.julialang.org/u/pbayer)\
**Post date:** [February 7, 2020, 7:01pm UTC](https://discourse.julialang.org/t/subtyping-with-parametric-abstract-types/34314/2 "2020-02-07T19:01:48Z")

</div>

isn’t …

```julia
julia> Sampleable{Univariate,Discrete} <: Sampleable{Multivariate,Discrete}
false

julia> Sampleable{Univariate,Continuous} <: Sampleable{Multivariate,Continuous}
false

julia> Distribution{Univariate,Discrete} <: Distribution{Multivariate,Discrete}
false

julia> Distribution{Univariate,Continuous} <: Distribution{Multivariate,Continuous}
false

```

what are you trying to achieve?

---

<div class="post-metadata">

**Author:** ![HenriDeh](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/henrideh/32/8316_2.png) [@HenriDeh](https://discourse.julialang.org/u/HenriDeh)\
**Post date:** [February 7, 2020, 8:18pm UTC](https://discourse.julialang.org/t/subtyping-with-parametric-abstract-types/34314/3 "2020-02-07T20:18:00Z")

</div>

MultiDist is a struct that is a `MultivariateDistribution`. One of the fields of that struct, `dist`, is a `UnivariateDistribution`. Both should have the same `ValueSupport`, either `Continuous` or `Discrete`. At no point in my example do I imply one of the  
relations you wrote.

---

<div class="post-metadata">

**Author:** ![pbayer](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/pbayer/32/11675_2.png) [@pbayer](https://discourse.julialang.org/u/pbayer)\
**Post date:** [February 7, 2020, 11:48pm UTC](https://discourse.julialang.org/t/subtyping-with-parametric-abstract-types/34314/4 "2020-02-07T23:48:19Z")

</div>

sorry, then I misunderstood you.

---

<div class="post-metadata">

**Author:** ![yuyichao](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/yuyichao/32/20_2.png) [@yuyichao](https://discourse.julialang.org/u/yuyichao)\
**Post date:** [February 8, 2020, 12:08am UTC](https://discourse.julialang.org/t/subtyping-with-parametric-abstract-types/34314/5 "2020-02-08T00:08:54Z")

</div>

Because you need to define `S` as a type parameter in order to use it, i.e. `MultiIDist{S <: ValueSupport, ...}`. Except in special cases like declaration of type parameter and declaration of type, `<:` doesn’t automatically declare a type parameter, the `S <: ValueSupport` in your code is simply an expression and the value of that expression is being applied to the type.
