If I create a local with (let [cs (Charset/forName "UTF-8")] ...) the local cs is automatically tagged with the type Charset, and any java method calls within the block will be inferred using that information.
If I create a namespace global with (def cs (Charset/forName "UTF-8")) the var cs is *not* tagged with the type Charset. If I want to prevent reflection in calls that use it, I need to write (def ^Charset cs (Charset/forName "UTF-8")).
I have seen a lot of reflection in various libraries that went away when top-level constants were type-hinted, and which wouldn't have shown up in the first place if their types were inferred. Is there a reason for the current behavior? Should it be changed?