[英]Clojure java interop - calling overloaded (static) methods
尽管我确实了解其背后的原因,但我发现LWJGL将OpenGL方法和值拆分为多个类的做法很烦人。 由于无论如何我都更喜欢处理函数,因此我目前正在编写一个Clojure模块,该模块在单个名称空间中公开OpenGL 3.3核心函数和常量。
现在的问题是,某些OpenGL函数在LWJGL中具有重载,例如glBindAttribLocation
对于ByteBuffer
具有一个重载,对于CharSequence
具有一个重载。 现在,我说的是最广义的“问题”,因为我不确定这是否真的是一个问题。
例如我可以写吗
(defn glBindAttribLocation [program index name]
(GL20/glBindAttribLocation program index name))
并相信Clojure会找出要调用的重载,还是我必须通过某种类型的提示手动进行此操作?
同样,LWJGL的许多函数采用float
或int
,但是我听说Clojure本身仅使用long
和double
(即原语)。 这是否意味着每次我调用这些函数之一时,无论我将什么转换为Integer
( Float
),然后从那里转换为int
( float
),无论何时我调用这些函数之一?
是的,如果由于重载而有多个候选调用方法,则可能需要强制数据键入正确的类型。 好消息是Clojure编译器可能会引发错误,而不是给您令人惊讶的行为。
请参见: Long的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
,除非可以将nil
用作name
参数,否则应该没问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.