It’s not a bug. hasmethod(f, Tuple{Union{}}) orhasmethod(f, Tuple{Any}) are asking whether f has a method whose argument type is Any or any supertype of Any, not any subtype which is what you are hoping for.
For example, hasmethod(f, Tuple{Real})will succeed if there is an f(x::Real) method, but also if there is an f(x::Number) or f(x::Any) method. It won’t succeed if there is only an f(x::Int) method.
One thing you could do to check whether f has a single-argument method would be to check any(m -> m.nargs == 2, methods(f)), although this relies on the undocumented internal field nargs of the Method type. (m.nargs == 2 seems to be correct for to test for 1 argument, since the function itself is apparently counted as an “argument” here.)
Update: My bad, I was confusing Union{} with Any. As was pointed out below, Union{} is a supertype of every type, so it seems like it should work.