Clojure java互操作调用重载(静态)方法

Clojure java互操作调用重载(静态)方法,java,clojure,interop,Java,Clojure,Interop,虽然我确实有些理解其背后的原因,但我发现LWJGL将OpenGL方法和值拆分到多个类中相当烦人。因为我更喜欢处理函数,所以我目前正在编写一个Clojure模块,它在单个名称空间中公开OpenGL 3.3核心函数和常量 现在的问题是,一些OpenGL函数在LWJGL中有重载,例如glBindAttribLocation有一个用于ByteBuffer和一个用于CharSequence。现在我说的是最广义的“问题”,因为我还不确定这是否真的是一个问题 比如说,我可以写一封信吗 (defn glBind

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

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

比如说,我可以写一封信吗

(defn glBindAttribLocation [program index name]
  (GL20/glBindAttribLocation program index name))
相信Clojure会找出要调用的重载,或者我必须手动使用一些typehint丑陋吗


同样,LWJGL的许多函数采用
float
s或
int
s-但我听说Clojure本身只使用
long
double
(即原语)。这是否意味着每次我调用其中一个函数时,我得到的任何东西都会被转换成一个
整数(
Float
),然后从那里转换成一个
int
Float
),每当我调用其中一个函数时,如果由于重载导致调用有多个候选方法,则可能需要将数据强制为正确的类型。好消息是Clojure编译器很可能会引发错误,而不是给出令人惊讶的行为


请参阅:

我在
long->int
转换方面遇到了奇怪的问题,但只有当
int
long
都存在重载签名时,才会产生歧义。如果只有
int
float
的方法(从文档看似乎就是这样),那么您应该可以。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)如果它们同时具有
int
long
版本,或者2)如果我将
nil
作为对象的参数传递,则无法猜测我想要哪个方法。由于前两个参数必须是
int
s,除非您可以为
name
参数传递
nil
,否则就可以了。

转换可能是直接的
long->int
float->double
,如果这是一个安慰的话:)调用重载函数真的是一个累赘,没有任何帮助。这似乎是
Long
s特有的问题。LWJGL库只使用
int
float
,重载类似于
ByteBuffer
vs
CharSequence
vs
CharSequence[]
。当编译时类型不明确时,您仍然可以得到一个警告,例如
反射警告、无法解析调用。