Type-instability of Parametrized Structs

First create all the data for our struct attributes.
We are going to create singletons of abstract type Car.
abstract type Car endstruct Volvo <: Car endstruct Mazda <: Car endThen consider the Struct where we want to store our data.
So, lets define a struct as
abstract type GeneralStruct endstruct AA{T} <: GeneralStruct vector::Vector{T} car::CarendThe basic idea is to test the correct parametrization of complex structs by accessing their attributes.
In order to do that, we define the necessary functions as:
function getvector(mystruct::S) where {S <: GeneralStruct} mystruct.vectorendfunction getcar(mystruct::S) where {S <: GeneralStruct} mystruct.carendInstantiate our struct with different types
a = AA([1.,2.,3.], Volvo())b = AA([1,2,3], Mazda())Each one is parametrized according to its input data. So, lets check for type stability.
getvector(a) getcar(a)So there seems to be an issue with how we parametrized the car attributes.
Therefore, we should better work with a new structure that also parametrizes the singletons of type Car as follows:
struct AB{T, C <: Car} <: GeneralStruct vector::Vector{T} car::Cenda = AB([1., 2., 3.], Volvo())This new object has parametrized all the data objects inside {Float64, Volvo} , so the compiler nows in advance what kind of objects to expect.
getcar(a)Now everything seems to be working fine.
The next step is try to make a collection with these structs, i.e., a dictionary or tuples. Let's see the difference.
aa = Dict{Symbol,T where T <: GeneralStruct}(:a=> a, :b=> b)bb = (; :a => a, :b => b)Dictionaries in this case doesn't seem to parametrize correctly these objects whereas for the NamedTuple created this problem is not present. Let's check this with an example.
First define a function that retrieves an element from it of type GeneralStruct.
function getfroma(a::Dict) a[:b]endfunction getfroma(a::NamedTuple) a[end]end getfroma(aa) getfroma(bb)Clearly the dictionary doesn't parametrize correctly the object inside, whereas for the named tuple it works correclty.