I can’t find this in the julia manual right now, but I’d always assumed that using <:Real inside a type on the left-hand side of a function definition f(x::A{<:Real}) is just an alias to f(x::A{T}) where {T<:Real}. But with julia 1.5.3 I’m getting a method error when trying to use ::Type{A{<:Real}}.
julia> struct A{T}; x::T; end
julia> f(::Type{A{<:Real}}) = true
f (generic function with 1 method)
julia> f(x::A) = f(typeof(x))
f (generic function with 2 methods)
julia> f(A(1))
ERROR: MethodError: no method matching f(::Type{A{Int64}})
Closest candidates are:
  f(::Type{A{var"#s1"} where var"#s1"<:Real}) at REPL[2]:1
  f(::A) at REPL[3]:1
Stacktrace:
 [1] f(::A{Int64}) at ./REPL[3]:1
 [2] top-level scope at REPL[4]:1
julia> f(::Type{A{T}}) where T = 123
f (generic function with 3 methods)
julia> f(A(1))
123
julia> f(::Type{A{T}}) where {T<:Real} = 456
f (generic function with 4 methods)
julia> f(A(1))
456
julia> 
Is there a reason for this? What am I doing wrong?