Вы сталкиваетесь с параметрической инвариантностью типов, это приятное оранжевое окно предупреждения в руководстве здесь .
Ссылаясь на соответствующую часть:
Конкретные типы точек с разными значениями T никогда не являются подтипами друг друга:
julia> Point{Float64} <: Point{Int64}
false
julia> Point{Float64} <: Point{Real}
false
Предупреждение
Этот последний пункт очень важен: даже если Float64 <: RealУ нас нет точки {Float64} <: Point {Real}. </p>
Для вашего примера вам потребуется:
f(arg::Array{<:Integer, 1}) = println("an array with integers")
# Alternatively f(arg::Array{T, 1}) where T <: Integer = println("an array with integers")
f(arg::Array{Signed, 1}) = println("an array with signed integers")
Первый метод - это запасной вариант.для общих целочисленных массивов, второй может быть вызван с определенным типом Array{Signed, 1}
:
julia> f([1,2,3])
an array with integers
julia> f(Array{UInt8, 1}([1,2,3]))
an array with integers
julia> f(Array{Signed, 1}([1,2,3]))
an array with signed integers