Also for completeness, the two ways around this are to use either.
f{T<:TypeAOrB}(::Array{T})
f(::Union{Array{TypeA},Array{TypeB}})
On Tue, Jan 12, 2016 at 7:07 PM, Keno Fischer <[email protected]>
wrote:
> This is explained in the manual:
> http://docs.julialang.org/en/release-0.4/manual/types/ (grep for
> invariant, not sure how to link a section). In short T <: S does not imply
> Array{T} <: Array{S}.
>
> On Tue, Jan 12, 2016 at 6:26 PM, Christian Winkler <
> [email protected]> wrote:
>
>> Suppose I have two types, and a Union of those two types. As expected, I
>> can pass either type in as an argument to a function where the
>> corresponding function argument is annotated with the Union:
>>
>> julia> type TypeA; a::Float64; end
>>
>> julia> type TypeB; a::Float64; b::Float64; end
>>
>> julia> TypeAorB = Union{TypeA,TypeB}
>> Union{TypeA,TypeB}
>>
>> julia> function foo(x::TypeAorB); x.a + 3; end
>> foo (generic function with 1 method)
>>
>> julia> a = TypeA(1.5)
>> TypeA(1.5)
>>
>> julia> foo(a)
>> 4.5
>>
>>
>> I can define a function that takes an argument which is an array whose
>> elements are members of that Union:
>>
>> julia> function foovec(x::Vector{TypeAorB}); [foo(xi) for xi in x]; end
>> foovec (generic function with 1 method)
>>
>> julia> methods(foovec)
>> # 1 method for generic function "foovec":
>> foovec(x::Array{Union{TypeA,TypeB},1}) at none:1
>>
>>
>> However, if I try to pass in any vector whose elements are of TypeA or
>> TypeB, I get an unexpected (to me at least) failure:
>>
>> julia> foovec([a,a])
>> ERROR: MethodError: `foovec` has no method matching
>> foovec(::Array{TypeA,1})
>>
>>
>> In my real use case, the vectors never mix elements from my two types, so
>> I can get the behavior that I want using a second Union (of vector types):
>>
>> julia> TypeAorBvec = Union{Vector{TypeA},Vector{TypeB}}
>> Union{Array{TypeA,1},Array{TypeB,1}}
>>
>> julia> function foovec(x::TypeAorBvec); [foo(xi) for xi in x]; end
>> foovec (generic function with 2 methods)
>>
>> julia> foovec([a,a])
>> 2-element Array{Float64,1}:
>> 4.5
>> 4.5
>>
>>
>> But I would like to know why the first example does not work.
>>
>> An even simpler example: if I define a function with an argument of type
>> Vector{Any}, then I cannot pass in an array of TypeA, again I get a "no
>> method matching" error.
>>
>>
>>
>>
>>
>>
>>
>> Please click here
>> <http://www.e-disclaimer.com/conning/AD21D06B4CC99D2B4F24BA73FB4EED83.htm>
>> for
>> important information regarding this e-mail communication.
>>
>
>