我如何输入提示来摆脱剩余的反射调用?
(def B
(amap ^"[[D" A i ^"[[D" B
(amap ^doubles (aget A (int i)) j ^doubles row
(* 2 (aget row (int j))))))
还剩下两个反射调用,但我不知道如何摆脱它们。
答案 0 :(得分:3)
您没有显示完整的代码或反射警告,但如果它们是我认为的那样,您将需要:
(def ^"[[D" A ...)
无论您在何处定义(double (* 2 ...))
提出这些修补程序的过程是在宏上执行宏扩展,运行该版本,查看导致反射警告的表达式,修复它们,并希望您可以将提示改装为原始宏,其中包含这种情况是可能的。我仍然建议更直接的解决方案。
答案 1 :(得分:1)
恕我直言,没有amap宏,这更容易做到:
(set! *warn-on-reflection* true)
(def ^"[[D" A (into-array [(double-array [0 1 2]) (double-array [2 3 4])]))
(def ^"[[D" B (into-array (map aclone A))) ; aclone is shallow
(dotimes [i (alength B)]
(let [^doubles row (aget B i)]
(dotimes [j (alength row)]
(aset row j (double (* 2 (aget row j)))))))
(doseq [row B]
(prn (vec row)))
答案 2 :(得分:0)
此页面(最后)提供了有关类型提示的详细信息:http://clojure.org/java_interop。它建议使用例如(让[n(int)])代替^ Integer等,这也使代码更具可读性。请注意,互联网上的很多材料似乎是旧版本的Clojure,你需要更少的类型提示1.2。