I'm doing some development and wondered if this kind of pattern is problematic:
abstract AbstractNode abstract PhylogenyNode <: AbstractNode abstract NetworkNode <: AbstractNode abstract AbstractEdge abstract PhylogenyEdge <: AbstractEdge abstract NetworkEdge <: AbstractEdge type Branch{N <: PhylogenyNode} <: PhylogenyEdge from::N{Branch} to::N{Branch} length::Float64 function Branch{N}(::Type{N}) x = new() length!(x, -1.0) return x end end type Clade{E <: PhylogenyEdge} <: PhylogenyNode from::E to::Vector{E} confidence::Float64 function Clade{E}(::Type{E}) x = new() x.to = Vector{E}() confidence!(x, -1.0) return x end end As you can see both concrete types are parametric, and as a result there is a certain circularity to it Clade{Branch{Clade{Branch{Clade{Branch}}}}}.... That ultimately ends in something like Clade{Branch{N<:PhylogenyNode}}. I'd like to know if this is type-certain or not - the fact it terminates in N<:PhylogenyNode or E<:PhylogenyEdge makes me doubt it.