【问题标题】:Clojure java interop - calling overloaded (static) methodsClojure java interop - 调用重载(静态)方法
【发布时间】:2012-10-09 15:17:41
【问题描述】:

虽然我确实有点理解其背后的原因,但我发现 LWJGL 将 OpenGL 方法和值拆分到众多类中相当烦人。因为无论如何我更喜欢处理函数,所以我目前正在编写一个 Clojure 模块,它在单个命名空间中公开 OpenGL 3.3 核心函数和常量。

现在的问题是,一些 OpenGL 函数在 LWJGL 中有重载,例如 glBindAttribLocation 有一个用于 ByteBuffer 和一个用于 CharSequence。现在我说的是广义上的“问题”,因为我还不确定这是否真的是一个问题。

我可以写吗

(defn glBindAttribLocation [program index name]
  (GL20/glBindAttribLocation program index name))

并相信 Clojure 会找出要调用的重载,还是我必须手动执行此操作并带有一些难看的类型提示?

同样,LWJGL 的许多函数都采用 floats 或 ints - 但我听说 Clojure 本身只使用 longdouble(即原语)。这是否意味着每次我调用这些函数之一时,无论何时我调用这些函数之一,我都会转换为 Integer (Float),然后从那里转换为 int (float)?

【问题讨论】:

  • 转换可能直接是long->intfloat->double,如果这有什么安慰的话:) 调用重载函数真的很麻烦,没有任何帮助。

标签: java clojure interop


【解决方案1】:

long->int 转换时我遇到了奇怪的问题,但只有当 intlong 的签名都重载时,才会产生歧义。如果只有 intfloat 的方法(从查看文档来看似乎是这种情况),那么你应该没问题。 Clojure 会自动进行 long->int 和 double->float 转换:

user=> (Float/isInfinite 5.0) ; Takes a float
false
user=> (Integer/numberOfTrailingZeros 4) ; Takes an int
2

至于GL20/glBindAttribLocation,我唯一需要强制转换的重载方法是 1) 如果它们同时具有 intlong 版本,或者 2) 如果我将 nil 作为对象的参数,因此无法猜测我想要哪种方法。由于前两个参数必须是ints,除非您可以为name 参数传递nil,否则应该没问题。

【讨论】:

    【解决方案2】:

    是的,如果由于重载导致调用有多个候选方法,您可能需要强制数据键入正确的类型。好消息是 Clojure 编译器可能会引发错误,而不是给您带来令人惊讶的行为。

    见:Clojure overloaded method resolution for Longs

    【讨论】:

    • 这似乎是Longs 特有的问题。 LWJGL 库仅使用 intfloat,重载类似于 ByteBuffer vs CharSequence vs CharSequence[]
    • 不完全。当编译时类型不明确时,您仍然会收到诸如Reflection warning, call to <class method-or-ctor> can't be resolved. 的警告。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 2011-02-12
    相关资源
    最近更新 更多