The benefit in templating method signatures is that you can match more closely
parameterized types.
f(a::Array{Integer})
Is very different from
f{T <: Integer}(a::Array{T})
Because one match only an array with element type "the abstract" Integer, and
the other match that and arrays of any subtype of Integer.
The compiler know the return type of a function when code_typed has a type
assertion on the return statement. That generally happen when the return type
only depends on the type of the arguments, and not on globals or argument
values.