Вы должны написать:
function f(x::Array{<:Real,1}, y::Real)
return [x..., y]
end
Это поведение объясняется в этом разделе https://docs.julialang.org/en/latest/manual/types/#Parametric-Types-1 руководства Julia.
Проблема в том, что Array{Float64,1}
не являетсяподтип Array{Real,1}
, но является подтипом Array{<:Real,1}
.
Вы можете проверить это, выполнив следующий код:
julia> Array{Float64,1} <: Array{Real,1}
false
julia> Array{Float64,1} <: Array{<:Real,1}
true
Мысленно вы можете прочитать Array{<:Real,1}
как любой векторчья спецификация типа элемента является подтипом Real
, тогда как Array{Real,1}
означает вектор, чья спецификация типа элемента точно равна Real
.Обратите внимание, что вы можете построить последний вектор, и это иногда полезно:
julia> Real[1, 1.0]
2-element Array{Real,1}:
1
1.0
(обратите внимание, что 1
и 1.0
были оставлены как есть, то есть как int и float), тогда как:
julia> [1, 1.0]
2-element Array{Float64,1}:
1.0
1.0
сделал преобразование обоих элементов в число с плавающей точкой.
Кроме того, причина, по которой Джулия рассматривает Array{Real, 1}
и Array{Float64, 1}
как подтипы друг друга, заключается в том, что оба массива имеют разный формат хранения.Array{Float64, 1}
просто хранит числа с плавающей точкой (поскольку Float64
является конкретным типом), тогда как Array{Real, 1}
будет хранить указатели на произвольные вещественные числа.