コンパイル時には利用できないが、実行時には利用できるJavaオブジェクトに、次のようにvarsでハンドルを設定しようとしています。
(def component-manager (delay (SomeJavaObject/getHandle)))
(遅延よりも優れたメカニズムが利用できる場合、これは歓迎されます)。
これらのオブジェクトを使用すると、反射警告が生成されます。これらはかなり頻繁に発生することがあるため、次の方法で回避しようとしました。
(def my-handle ^SomeJavaObject (delay (SomeJavaObject/getHandle)))
残念ながら、この場合でも反射警告が生成されます。
参照の変更は機能します:
(.foo ^SomeJavaObject @my-handle)
...しかし、これはコードを大幅に醜くします。
タイプヒントを追加するマクロでラップすることは、明らかなアプローチのようです。
(def my-handle' (delay (SomeJavaObject/getHandle)))
(defmacro my-handle []
(with-meta '(deref my-handle')
{:tag SomeJavaObject}))
...そしてそれは正しいことをするはずのように見えます:
=> (set! *print-meta* true)
=> (macroexpand '(my-handle))
^SomeJavaObject (deref my-handle')
...しかし、ゴムが道路にぶつかったとき、これは当てはまりません:
=> (.foo (my-handle))
Reflection warning, NO_SOURCE_PATH:1 - reference to field foo can't be resolved.
これを行う正しい方法は何ですか?