Both arguments need to be of the same type, and due to only concrete types of the passed in objects (instead of their abstract super types) being used in dispatch, the constraint that the types must be the same results in dispatch saying “the types don’t match, ergo there’s a MethodError”. Runtime objects can never have an abstract type.
Julia doesn’t implicitly constrain T to be a concrete type - it’s the concreteness of the types of the objects that results in the MethodError.