Good question, I would be interested in the answer myself. If the tips indicate the explicit type dependency is preferred, then I guess that for the first form the compiler compiles a new instance of the function specifically for the concrete type `T`, while in the second, it presumably compiles to deal with a (partly) type-instable `x` within the function body.
f1{R<:Real}(x::R) = -x f1(x::Real) = x f1 (generic function with 2 methods) So the methods are kept separate, but I think the first form hides access to the second form. On Monday, December 8, 2014 7:12:39 AM UTC+1, Igor Demura wrote: > What exactly the difference between: > function foo{T<:AbstractType}(x::T) = ... > and > function foo(x::AbstractType) = ... ? > Is any difference at all? The "tips" section of the docs says the second > is preferred. If they are the same, why first syntax? I can imagine that I > can benefit if I have several parameters: > function bar{T<:AbstractType}(x::Concrete{T}, y::AnotherOf{T}, z::T) = ... > >