我正在尝试使用
一切都编译通过了,但是当我运行它时,会得到一个空指针异常。我怀疑这是因为我覆盖了错误的方法(即
gen-class
在clojure中重写此类中的compare(WriteableComparable a, WriteableComparable b)
方法,但麻烦在于该方法被重载了3次:
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))))
一切都编译通过了,但是当我运行它时,会得到一个空指针异常。我怀疑这是因为我覆盖了错误的方法(即
compare(Object a, Object b)
而不是预期的compare(WritableComparable a, WritableComparable b)
)。供参考,compare
的Object
版本会调用WriteableComparable
版本。
很有可能NPE来自其他地方,但是我至少将其缩小到这个Clojure代码上(当我使用相应的Java版本运行它时,一切正常)。
有没有办法指定要使用哪个重载的方法?
(我尝试在gen-class
调用中添加:methods
子句,但我了解到只应声明新方法,而不是超类方法。)
gen-class
的使用方式又多了一种神秘的方法。我曾经想过这个问题,但并不需要答案,所以把它放在了脑后。 - Mars