虽然我有点理解它背后的原因,但我发现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
s - 但我听说Clojure本身只使用long
和double
(原始的是)。这是否意味着每当我调用其中一个函数时,无论我将其转换为Integer
(Float
),然后从那里转换为int
(float
)我称之为这些功能之一?
答案 0 :(得分:0)
是的,如果由于重载而有多个候选方法用于调用,则可能需要强制数据键入正确的类型。好消息是Clojure编译器可能会引发错误,而不是给你带来惊人的行为。
答案 1 :(得分:0)
long->int
转换时遇到了奇怪的问题,但只有在int
和long
都有重载签名时才会产生歧义。如果只有int
和float
的方法(从查看文档似乎就是这种情况)那么你应该没问题。 Clojure将自动执行long-gt; 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,除非您可以为nil
参数传递name
,否则您应该没问题。