我在使用clojure中的java float数组上的实例方法时遇到了一些麻烦.具体来说,以下代码在调用时给出了反射警告.length
(defn make-matrix
([^floats fs]
(let [len-fs (.length fs)]
(cond (>= len-fs 16) (Matrix4. fs)
(>= len-fs 9) (Matrix3. fs)
:else (throw (IllegalArgumentException. (str "Array must have at least 9 elements (found" len-fs ")")))))))
Run Code Online (Sandbox Code Playgroud)
根据我的理解,类型提示应该消除了解析调用的反射需求.length.我错过了什么?
Mic*_*zyk 10
JVM上的数组不像常规对象,它们的长度不是通过字段查找获得的,而是通过专门的操作码获得的arraylength.Java的array.length符号只是语法糖,可以编译成这个操作码.因此,(.length fs)在运行时只会失败,因为fs会发现既没有length方法也没有length字段(假设它实际上是一个数组).
因此,您应该使用以下clojure.core/alength功能:
(alength fs)
Run Code Online (Sandbox Code Playgroud)
没有类型提示,这将导致反射调用; 使用类型提示,它将直接调用返回的静态方法fs.length(使用Java表示法).