Julia only supports concrete leaves in the type tree - all non-leaves
(parents) must be abstract types.
You should be able to do:
abstract AbstractDataStream{T <: Number}
type DirectedDataStream{T <: Number} <: AbstractDataStream{T}
data::Vector{T}
stuff
end
type ReversedDataStream{T <: Number} <: AbstractDataStream{T}
data::Vector{T}
stuff
end
Another thing you can do that still leverages multiple dispatch is define
the reversal as a separate type:
abstract Direction
type ForwardDirection <: Direction end
type BackwardDirection <: Direction end
type MyDataStream{T<:Number, D<:Direction}
data::Vector{T}
direction::D
stuff
end
Base.plus{T<:Number, S<:Number, D<:ForwardDirection}(a::MyDataStream{T,D}, b
::MyDataStream{S,D}) ...
Base.plus{T<:Number, S<:Number, D<:BackwardDirection}(a::MyDataStream{T,D},
b::MyDataStream{S,D}) ...