dsg*_*dsg 5 java interop clojure gen-class
我正试图在clojure中gen-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))))
Run Code Online (Sandbox Code Playgroud)
一切都编译,但是当我运行它时,我得到一个空指针异常,我怀疑这是因为我重写了错误的方法(即compare(Object a, Object b)代替了预期的方法compare(WritableComparable a, WritableComparable b)).供参考,通过Object版本compare调用的WriteableComparable版本.
NPE完全有可能来自其他东西,但我至少将它缩小到这个clojure代码(当我使用相应的Java版本运行它时,事情很好).
有没有办法指定应该使用哪个方法的重载版本?
(我尝试:methods在gen-class调用中添加一个子句,但我了解到应该只声明新方法,而不是超类方法.)
有一种机制可以使用gen-class并允许覆盖相同的arity重载方法.除了前缀和方法名称之外,我们还可以定义包含参数类型的名称的vars /函数.要覆盖一个方法,foo(String s, Object o)我们可以定义一个名为var 的方法-foo-String-Object.代码将在返回之前查找因此命名的var -foo.至少在一个Clojure邮件列表线程中记录了这一点.
在实践中,这意味着您可以编写如下代码:
(defn interop-compare [this a b c d e f]
(do-array-compare))
(defn interop-compare-Object-Object [this a b]
(do-object-compare))
(defn interop-compare-WritableComparable-WritableComparable [this a b]
(do-writable-comparable-thing))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
662 次 |
| 最近记录: |