我試圖用gen-class
覆蓋clojure中的compare(WriteableComparable a, WriteableComparable b)
方法this class。併發症源於一個事實,即這種方法被重載3次:Clojure gen-class用於重載和重寫的方法
int compare(WritableComparable a, WritableComparable b)
int compare(Object a, Object b)
int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2)
到目前爲止,我的嘗試是這樣的:
(gen-class
:name comparators.MyWriteableComparator
:extends org.apache.hadoop.io.WritableComparator
:exposes-methods {compare superCompare}
:prefix "interop-")
(defn interop-compare
([this a b c d e f]
(.superCompare this a b c d e f))
([this ^WritableComparable w1 ^WritableComparable w2]
(.compareTo (.getSymbol ^SymbolPair w1)
(.getSymbol ^SymbolPair w2))))
一切都在編譯,但是當我運行它時,我得到一個空poi但我懷疑這是因爲我忽略了錯誤的方法(即代替compare(WritableComparable a, WritableComparable b)
而代替compare(Object a, Object b)
)。 For reference,Object
版本的compare
呼叫到WriteableComparable
版本。我們至少把它縮小到這個clojure代碼(當我用相應的Java版本運行它時,情況很好),這完全有可能是NPE來自其他東西。
是否有方法來指定應該使用哪種重載版本的方法?
(我嘗試添加一個:methods
條款列入gen-class
電話,但我知道,一個人應該只聲明新的方法,而不是超類的方法。)
哇。另一種使用'gen-class'的方法是黑暗藝術。我曾想過這個問題,但並不需要答案,所以把它放在我的腦海裏。 – Mars