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?

Original source