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