I would have expected that both of the Java interop calls below would avoid reflection, but only the first involving f1 does.
Not sure if this has anything to do with CLJ-1232, but was discovered when testing variants of that issue.
This isn't an issue of arg vector hinting vs function name hinting.
The issue here is that return type hinting cannot be put on anonymous functions but only on defns as the :arglists will be added by defn on the Var's metadata.
This is one of the reasons why I'd like to have that information as a field on the fn rather than as metadata on the Var
Jozef, you may be correct that non-primitive type hints on the argument vector are non idiomatic. Do you have any source for that I could read?
Only the version with hints on the argument vectors is documented at http://clojure.org/java_interop#Java Interop-Type Hints. However, in the case you have just one arity (or all arities return a value of the same type) the hint on the var name also works. But the two versions seem to have different semantics. Have a look at CLJ-1232.
Type hinting is a very intricate part of Clojure but you can almost always apply a 'place hint on a symbol' idiom. Type hinting on an arg vector must be done only in two cases:
different return classes for different arities
In the first case, compiler needs type hints when compiling fn* (see ), not later, thus you must specify them on arg vector.
Second case, which is the issue discussed here, must be used only when defining with defn. Compiler first looks for the tag in the metadata of a var, and if it does not find one, it has a special case in which it looks for a return class inside :arglist metadata. This is clearly a very special case  to handle situations where you have different return classes for different arities. Obviously, using def instead of defn won't create an :arglist metadata for you thus you see a reflection warning. Example:
BTW has a discussion slightly relevant to this topic.