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

f(x::Foo, y::Int) = "method 2"

which then eliminates the ambiguity, but it doesn't behave this way, why is 
that?

Reply via email to