Suppose I want to define a type like:
abstract AbstractSubThing{T}
type SubThing{T} <: AbstractSubThing
item::T
end
# the trouble
type WrapThing{Tx, Ty<:AbstractSubThing{Tx}}
sub::Ty
outer::Tx
end
#ERROR: UndefVarError: Tx not defined
type WrapThing{Tx, Ty<:AbstractSubThing}
sub::Ty{Tx}
outer::Tx
end
#ERROR: TypeError: Type{...} expression: expected Type{T}, got TypeVar
Essentially I want to have WrapThing
enforce type consistency so it only accepts SubThing
s which are consistent with its other arguments. E.g.
WrapThing(SubThing(1.0), 1.0) #good
WrapThing(SubThing(1.0), 1) #should throw error
I’ve tried a bunch of different plausible seeming strategies. Clearly I’m missing some of the finer points of the type system, but don’t know where I’m going wrong.
While needing to be able to swap out SubThing
for some other flavour of AbstractSubThing
later (e.g. in my problem a different database backend).