我正在尝试使用gen-class
覆盖clojure中this class中的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))))
Everything编译,但是当我运行它时,我得到一个空指针异常,我怀疑是因为我覆盖了错误的方法(即compare(Object a, Object b)
而不是预期的compare(WritableComparable a, WritableComparable b)
)。 Object
compare
版WriteableComparable
版本调用了:methods
版本。
NPE完全有可能来自其他东西,但我至少将它缩小到这个clojure代码(当我使用相应的Java版本运行它时,事情运行良好)。
有没有办法指定应该使用哪种方法的重载版本?
(我尝试在gen-class
调用中添加IBreakpointsExtension.IBreakpointHitDMEvent
子句,但我了解到应该只声明新方法,而不是超类方法。)
答案 0 :(得分:6)
有一种机制适用于std::string array[] = {"one", "two", "three"};
,并允许覆盖相同的arity重载方法。除了前缀和方法名称之外,我们还可以定义包含参数类型的名称的vars /函数。要覆盖gen-class
之类的方法,我们可以定义名为foo(String s, Object o)
的var。代码将在回退到-foo-String-Object
之前查找因此命名的var。至少在one of the Clojure mailing list threads中记录了这一点。
实际上,这意味着您可以编写如下代码:
-foo