繁体   English   中英

Clojure Java Interop-调用重载(静态)方法

[英]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的许多函数采用floatint ,但是我听说Clojure本身仅使用longdouble (即原语)。 这是否意味着每次我调用这些函数之一时,无论我将什么转换为IntegerFloat ),然后从那里转换为intfloat ),无论何时我调用这些函数之一?

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

请参见: Long的Clojure重载方法解析

我在使用long->int转换时遇到了怪异的问题,但是仅当intlong签名都重载时,才产生了歧义。 如果只有用于intfloat方法(从看文档的情况来看是可行的),那么您应该没问题。 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)如果它们同时具有intlong版本,或者2)如果我将nil作为对象的参数传递,则不可能猜猜我想要哪种方法。 由于前两个参数必须为int ,除非可以将nil用作name参数,否则应该没问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM