[英]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.