Julia's type hierarchies use single inheritance only. Thus inheritance
mechanisms that work fine in C++ can't always be made to work in
Julia. There are discussions on introducing concepts (traits), but
that's still in a prototype stage. (I'm using traits
<https://github.com/mauro3/Traits.jl> in a project of mine; this works
fine, only the error messages are sometimes confusing.)
If you have `Name1{S <: Name2} <: S`, and you need to stick with
single inheritance, then you essentially define both
`Name1{S} <: Name1
`Name1{S} <: S`
(here `Name1` is the abstract type that Julia introduces for every
parameterized type; `Name1` is different from `Name1{S}`).
Since Julia uses single inheritance, you also need to have either
`Name1 <: S` or `S <: Name1`. Both would be strange, since they would
introduce a relation between `Name1` and `S`, but you haven't
specified `S`.
-erik
On Sat, Apr 2, 2016 at 3:36 PM, Scott Lundberg <[email protected]> wrote:
> Thanks Erik, though I am not quite clear how it would break things.
>
> As for the real goal:
>
> Name2 is also templated such as Name2{A} and Name2{B}. There are lots of
> methods that dispatch depending on Name2{A} or Name2{B}.
>
> I want to add a subtype of Name2 (which I call Name1) that still correctly
> dispatches for those methods. Another way I would like to do it is:
>
> abstract Name1{Name2{T <: AvsB} <: Name2{T}
>
> but of course that also does not work.
>
> Thanks!
>
> On Saturday, April 2, 2016 at 11:55:47 AM UTC-7, Erik Schnetter wrote:
>>
>> If you define an abstract type `Name1{S}`, then Julia automatically
>> defines another abstract type `Name` with `Name1{S} <: Name`.
>>
>> This would break if you tried to insert `S` into the type hierarchy as
>> well.
>>
>> -erik
>>
>> On Sat, Apr 2, 2016 at 2:51 PM, Tomas Lycken <[email protected]> wrote:
>> > If it's abstract, what is the purpose of the type parameter? In other
>> > words,
>> > what is the ultimate goal you're reaching for?
>> >
>> > //T
>> >
>> > On Saturday, April 2, 2016 at 3:17:34 AM UTC+2, Scott Lundberg wrote:
>> >>
>> >> You can define:
>> >>
>> >> abstract Name1{S <: Name2} <: Name3{S}
>> >>
>> >> but I want to define:
>> >>
>> >> abstract Name1{S <: Name2} <: S
>> >>
>> >> However the second line does not work. Is there some other way to
>> >> accomplish the same thing? Thanks!
>>
>>
>>
>> --
>> Erik Schnetter <[email protected]>
>> http://www.perimeterinstitute.ca/personal/eschnetter/
--
Erik Schnetter <[email protected]>
http://www.perimeterinstitute.ca/personal/eschnetter/