Clojure gen-class 用于重载和覆盖方法
Clojure gen-class for overloaded and overridden methods
我正在尝试使用 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))))
一切都编译,但是当我 运行 它时,我得到一个空指针异常,我怀疑这是因为我覆盖了错误的方法(即 compare(Object a, Object b)
而不是打算 compare(WritableComparable a, WritableComparable b)
)。 For reference,compare
的 Object
版本调用到 WriteableComparable
版本。
NPE 完全有可能来自其他东西,但我至少已经将它缩小到这个 clojure 代码(当我 运行 它与相应的 Java 版本时,事情工作得很好)。
有没有办法指定应该使用该方法的哪个重载版本?
(我尝试在 gen-class
调用中添加一个 :methods
子句,但我了解到应该只声明新方法,而不是超类方法。)
有一种机制可以与 gen-class
一起使用,并允许覆盖相同数量的重载方法。除了前缀和方法名称之外,我们还可以使用包含参数类型的名称来定义变量/函数。要覆盖像 foo(String s, Object o)
这样的方法,我们可以定义一个名为 -foo-String-Object
的变量。代码将在回退到 -foo
之前寻找这样命名的 var。这至少记录在 one of the Clojure mailing list threads.
中
实际上,这意味着您可以编写如下代码:
(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))
我正在尝试使用 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))))
一切都编译,但是当我 运行 它时,我得到一个空指针异常,我怀疑这是因为我覆盖了错误的方法(即 compare(Object a, Object b)
而不是打算 compare(WritableComparable a, WritableComparable b)
)。 For reference,compare
的 Object
版本调用到 WriteableComparable
版本。
NPE 完全有可能来自其他东西,但我至少已经将它缩小到这个 clojure 代码(当我 运行 它与相应的 Java 版本时,事情工作得很好)。
有没有办法指定应该使用该方法的哪个重载版本?
(我尝试在 gen-class
调用中添加一个 :methods
子句,但我了解到应该只声明新方法,而不是超类方法。)
有一种机制可以与 gen-class
一起使用,并允许覆盖相同数量的重载方法。除了前缀和方法名称之外,我们还可以使用包含参数类型的名称来定义变量/函数。要覆盖像 foo(String s, Object o)
这样的方法,我们可以定义一个名为 -foo-String-Object
的变量。代码将在回退到 -foo
之前寻找这样命名的 var。这至少记录在 one of the Clojure mailing list threads.
实际上,这意味着您可以编写如下代码:
(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))