You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Clojure报PersistentArrayMap转Number异常,未定义该Map求原因

问题分析与修复

错误根源

ClassCastException的本质是你把brick这个Clojure map(PersistentArrayMap类型)当成数字传给了JOML的Vector3f方法。错误栈指向第107行,但实际问题出在两处:

  1. 第107行:定义ball-center时直接引用了未初始化的ball-center变量,导致传入nil作为目标Vector,写法不规范。
  2. 第108行:(.div brick-size brick (float 2) brick-half-size)中,错误地将brick(map)作为除数参数传入div方法,而JOML的div需要数字或Vector类型,JVM尝试转换map为Number时抛出异常。

修正后的代码

(defn ball-collision?
  [ball brick]
  (let [^org.joml.Vector3f ball-pos (:position ball)
        ^org.joml.Vector3f brick-pos (:position brick)
        ^org.joml.Vector3f brick-size (:size brick)
        radius (float (:radius ball))
        ; 显式创建目标Vector,避免未初始化引用
        ball-center (.add ball-pos radius radius (float 0) (org.joml.Vector3f.))
        ; 替换brick为(float 2),正确计算半尺寸
        brick-half-size (.div brick-size (float 2) (org.joml.Vector3f.))
        brick-center (.add brick-pos brick-half-size (org.joml.Vector3f.))
        center-distance (.sub ball-center brick-center (org.joml.Vector3f.))
        clamped (clamp center-distance brick-half-size (org.joml.Vector3f.))
        closest (.add brick-center clamped (org.joml.Vector3f.))
        distance (.sub ball-center closest (org.joml.Vector3f.))]
    (< (.length distance) radius)))

关键修正点

  • 所有JOML方法的目标Vector参数都显式创建org.joml.Vector3f.实例,避免使用未初始化的变量。
  • 第108行把错误的brick参数换成(float 2),匹配Vector3f.div(float scalar, Vector3f dest)的方法签名,正确实现尺寸减半。
  • 确保所有方法参数类型匹配,杜绝将Clojure map传入需要数字/Vector的参数位置。

内容的提问来源于stack exchange,提问作者user1785730

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 08:43:21