Clojure で deftype を使用しているときに問題が発生しました。次のコードを実行すると:
(defprotocol TestProt
(geta [this])
(getb [this]))
(deftype TestType [a b]
TestProt
(geta [this] a)
(getb [this] b))
(defn test-function [^TestType a-testtype]
(print (.geta a-testtype)))
(def test-tt (TestType. 1 1))
(test-function test-tt)
次に、コンパイラがスローします: ClassCastException MyProject.core.TestType を MyProject.core.TestType にキャストできません。私は何か間違ったことをしていますか、それともこれはバグですか? テスト関数から型注釈を削除すると、次のようになることに注意してください。
(defn test-function [a-testtype]
(print (.geta a-testtype)))
その後、コードは正常に動作しますが、リフレクションに関する警告 (warn-on-reflect が有効になっている場合) が表示され、実行が遅くなり、現在のユースケースで deftype を使用する目的が無効になります。
編集:わかりました、コードはreplで機能しますが、ctrl-alt-sを使用してロードすると機能しません(反時計回りでEclipseで実行しています)。したがって、問題はEclipseまたは反時計回りにあるようです。