On Wed, 2016-10-12 at 20:03, Yichao Yu <yyc1...@gmail.com> wrote:
> On Wed, Oct 12, 2016 at 1:22 PM, esproff <espr...@gmail.com> wrote:
>
>> Consider the code:
>>
>> abstract AbstractFoo
>>
>> type Foo <: AbstractFoo
>> end
>>
>> f(x::AbstractFoo, y::Integer) = "method 1"
>> f(x::Foo, y::Real) = "method 2"
>>
>> foo = Foo()
>> f(foo, 1)
>>
>> This code results in an ambiguity error, since both methods contain one
>> argument with a more specific type declaration than the other.  Now
>> consider this code:
>>
>> abstract AbstractFoo
>>
>> type Foo <: AbstractFoo
>> end
>>
>> f(x::AbstractFoo, y::Integer) = "method 1"
>> f{T<:Real}(x::Foo, y::T) = "method 2"
>>
>> foo = Foo()
>> f(foo, 1)
>>
>> This code, in my opinion, should work, since the second method spawns a
>> bunch of sub-methods, one for each concrete subtype of Real in the second
>> argument, and thus one of these sub-methods should be
>>
>
> No the set of signature the second method matches in the second case is the
> same as that in the first case.

However, somewhat similar, this does not error:

julia> g(x) = 1
g (generic function with 1 method)

julia> g{X}(x::X) = 2
g (generic function with 2 methods)

julia> g(4)
2

So here the parameterized method does seem more specific.

Reply via email to