簡體   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