Clojure java interop - 调用重载(静态)方法

时间:2012-10-09 15:17:41

标签: java clojure interop

虽然我有点理解它背后的原因,但我发现LWJGL将OpenGL方法和值分解为很多类而非常烦人。由于我更喜欢​​处理函数,我现在正在编写一个Clojure模块,它在单个命名空间中公开OpenGL 3.3核心函数和常量。

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

我可以写一下

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

并相信Clojure会找出要调用的重载,或者我是否必须手动执行某些类型提示 - 丑陋?

在同一个注释中,LWJGL的许多函数都使用floatint s - 但我听说Clojure本身只使用longdouble(原始的是)。这是否意味着每当我调用其中一个函数时,无论我将其转换为IntegerFloat),然后从那里转换为intfloat)我称之为这些功能之一?

2 个答案:

答案 0 :(得分:0)

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

请参阅:Clojure overloaded method resolution for Longs

答案 1 :(得分:0)

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