Does this meet your need?
struct MyData{S, T<:Union{S, Complex{S}}}
a::S # Real
b::T # Real or Complex
end
data1 = MyData(1.0, 2.0)
data2 = MyData(1.0, 2.0+1.0im)
data3 = MyData(1, 2)
data4 = MyData(1, 2-2im)
dispatch(x::MyData{Float64, Float64}) =
x == data1
dispatch(x::MyData{Float64, Complex{Float64}}) =
x == data2
dispatch(x::MyData{Int64, T}) where {T<:Union{Int64, Complex{Int64}}} =
x == data3 || x == data4
# or the last can be done this way
const MaybeComplexInt64 =
Union{Int64, Complex{Int64}}
dispatch(x::MyData{Int64, T}) where {T<:MaybeComplexInt64} =
x == data3 || x == data4
julia> dispatch(data1)
true
julia> dispatch(data2)
true
julia> dispatch(data3)
true
julia> dispatch(data4)
true