# AbstractStrings, Strings, and their Arrays

**URL:** <https://discourse.julialang.org/t/abstractstrings-strings-and-their-arrays/2724>\
**Category:** General Usage\
**Tags:** strings\
**Created:** [March 17, 2017, 8:03am UTC](https://discourse.julialang.org/t/abstractstrings-strings-and-their-arrays/2724 "2017-03-17T08:03:49Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![msravi](https://avatars.discourse-cdn.com/v4/letter/m/4da419/32.png) [@msravi](https://discourse.julialang.org/u/msravi)\
**Post date:** [March 17, 2017, 8:03am UTC](https://discourse.julialang.org/t/abstractstrings-strings-and-their-arrays/2724/1 "2017-03-17T08:03:49Z")

</div>

Hi,

I know from reading the Julia documentation (and experimenting), that although `String <: AbstractString` is true, `Array{String} <: Array{AbstractString}` is false. So if I have a function that needs to accept an array of all types of strings, what is the right way?

Option 1:

```julia
function myFunction(instr::Array{AbstractString,1})
:
end

function myFunction(instr::Array{String,1})
:
end

```

Option 2:

```julia
function myFunction(instr::Union{Array{AbstractString,1}, Array{String,1}})
:
end

```

Is there a preferred way to do this? Are there performance penalties in using either of these options?

Thanks,  
Ravi

---

<div class="post-metadata">

**Author:** ![wonjinChoi](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/wonjinchoi/32/11602_2.png) [@wonjinChoi](https://discourse.julialang.org/u/wonjinChoi)\
**Post date:** [March 17, 2017, 8:38am UTC](https://discourse.julialang.org/t/abstractstrings-strings-and-their-arrays/2724/2 "2017-03-17T08:38:32Z")

</div>

Why not using [Parametric Methods](http://docs.julialang.org/en/stable/manual/methods/#parametric-methods)

```julia
function myFunction{T <: AbstractString}(instr::Array{T,1})
:
end

```

---

<div class="post-metadata">

**Author:** ![mkborregaard](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mkborregaard/32/556_2.png) [@mkborregaard](https://discourse.julialang.org/u/mkborregaard)\
**Post date:** [March 17, 2017, 8:38am UTC](https://discourse.julialang.org/t/abstractstrings-strings-and-their-arrays/2724/3 "2017-03-17T08:38:43Z")

</div>

```julia
function myFunction{S <: String}(instr::Array{S})
...
end

```

or on 0.6

```julia
function myFunction(instr::Array{S}) where S <: String
...
end

```

[http://docs.julialang.org/en/release-0.5/manual/methods/#parametric-methods](http://docs.julialang.org/en/release-0.5/manual/methods/#parametric-methods)

(oh and it should really be `AbstractArray` because function arguments should dispatch on abstract types, but I didn’t change that to not cause additional confusion).

EDIT: Overlapping responses with the above 🙂

---

<div class="post-metadata">

**Author:** ![bicycle1885](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bicycle1885/32/107_2.png) [@bicycle1885](https://discourse.julialang.org/u/bicycle1885)\
**Post date:** [March 17, 2017, 9:03am UTC](https://discourse.julialang.org/t/abstractstrings-strings-and-their-arrays/2724/4 "2017-03-17T09:03:48Z")

</div>

Two cents from me, you can write it like this on Julia 0.6:

```julia
julia> Vector{<:AbstractString}
Array{#s1,1} where #s1<:AbstractString

```

---

<div class="post-metadata">

**Author:** ![mkborregaard](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mkborregaard/32/556_2.png) [@mkborregaard](https://discourse.julialang.org/u/mkborregaard)\
**Post date:** [March 17, 2017, 9:13am UTC](https://discourse.julialang.org/t/abstractstrings-strings-and-their-arrays/2724/5 "2017-03-17T09:13:35Z")

</div>

awesome

---

<div class="post-metadata">

**Author:** ![msravi](https://avatars.discourse-cdn.com/v4/letter/m/4da419/32.png) [@msravi](https://discourse.julialang.org/u/msravi)\
**Post date:** [March 17, 2017, 9:25am UTC](https://discourse.julialang.org/t/abstractstrings-strings-and-their-arrays/2724/6 "2017-03-17T09:25:24Z")

</div>

Thank you all!

---

<div class="post-metadata">

**Author:** ![msravi](https://avatars.discourse-cdn.com/v4/letter/m/4da419/32.png) [@msravi](https://discourse.julialang.org/u/msravi)\
**Post date:** [March 17, 2017, 9:37am UTC](https://discourse.julialang.org/t/abstractstrings-strings-and-their-arrays/2724/7 "2017-03-17T09:37:22Z")

</div>

Is there a reason you use String and not AbstractString here? So in effect, shouldn’t it be:

```julia
function myFunction{S <: AbstractString}(instr::AbstractArray{S})
...
end

```

---

<div class="post-metadata">

**Author:** ![mkborregaard](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mkborregaard/32/556_2.png) [@mkborregaard](https://discourse.julialang.org/u/mkborregaard)\
**Post date:** [March 17, 2017, 9:43am UTC](https://discourse.julialang.org/t/abstractstrings-strings-and-their-arrays/2724/8 "2017-03-17T09:43:25Z")

</div>

For some reason I’d gotten into my head that `String` was the new abstract type for strings, but it isn’t. So `String` was just wrong 🙂
