Vector{AbstractString} function parameter won't accept Vector{String} input in julia
invariance, julia
Solution
You need to write the function signature like this:
function foo{S<:AbstractString}(a::Vector{S})
# do stuff
end
On Julia 0.6 and newer, it's also possible to write instead
function foo(a::Vector{<:AbstractString})
# do stuff
end
This is a consequence of parametric type invariance in Julia. See the chapter on types in the manual for more details.
Problem
The following code in Julia: ``` function foo(a::Vector{AbstractString}) end foo(["a"]) ``` gives the following error: ``` ERROR: MethodError: no method matching foo(::Array{String,1}) Closest candidates are: foo(::Array{AbstractString,1}) at REPL[77]:2 ``` Even though the following code runs, as expected: ``` function foo(a::Vector{String}) end foo(["a"]) ``` And further, `AbstractString` generally matches `String` as in: ``` function foo(::AbstractString) end foo("a") ``` How can I call a function with a `Vector{AbstractString}` parameter if I have `String` elements?