2012-10-09 61 views
2

雖然我有點明白它背後的原因,我發現OpenGL的方法和價值在衆多的類,而惱人的LWJGL的分裂。因爲我更喜歡處理函數,所以我目前正在編寫一個Clojure模塊,在單個命名空間中公開OpenGL 3.3核心函數和常量。Clojure的Java的互操作 - 調用重載(靜態)方法

現在的問題是,一些OpenGL函數在LWJGL中有過載,例如glBindAttribLocation有一個用於ByteBuffer,另一個用於CharSequence。現在我從最廣泛的意義上說'問題',因爲我不確定這是否真的是'問題'。

我例如可以只寫

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

,並相信Clojure的會找出哪些超載打電話,還是我與一些typehint-uglyness手動做到這一點?

在相同的備忘,許多LWJGL的職能採取float S或int秒 - 但我聽到的Clojure本身只使用longdouble(即原語)。這是否意味着我每次調用其中一個函數時,無論我何時調用其中一個函數,都會將其轉換爲IntegerFloat),然後從那裏轉換爲intfloat)?

+0

轉換可能是直接'long-> int'和'float-> double',如果這是任何安慰:)調用重載函數真的是一個拖動,沒有幫助。 –

回答

0

是的,你可能會需要強制的數據是否有因超載多個候選方法調用輸入正確的類型。好消息是Clojure編譯器可能會引發一個錯誤,而不是給你一個令人驚訝的行爲。

參見:Clojure overloaded method resolution for Longs

+0

這似乎是一個問題特別是'長'。 LWJGL庫只使用'int'和'float',重載就像'ByteBuffer' vs'CharSequence'對'CharSequence []' – Cubic

+0

不完全。當編譯時類型不明確時,您仍然可以收到警告,如反射警告,調用無法解析。 – noahlz

0

我有奇怪的問題,與long->int轉換,但只有當一個重載的簽名都intlong,創造模糊。如果只對intfloat方法(其中,從看文檔似乎是這樣),那麼你應該罰款。 Clojure的將自動進行長期> int和雙>浮動轉換:

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,除非你可以通過nilname參數,那麼你應該罰款。