So to answer my own question, this is in 1.4.0.
Here is an example:
(binding [*data-readers* {'user/f (fn [x] (java.io.File. (first x)))}] (read-string "#user/f [\"hello\"]"))
returns
#<File hello>
On the best way to pass types around, though, I still think this is an open question.
The problem is that, currently, the default print behavior of java objects is an unreadable form like
I think there should be discussion about defaulting this to
#java.class.name [args*]this form is still unreadable by default, but with tagged literals, allows users to define custom reader behavior per class.
Either that or is there a way to alter the printing behavior of java objects locally, instead of globally as when defining a print-method for that type?