2011-05-19 35 views
12

例如,給定一個Java類,如:如何在Clojure中使用重載方法代理Java類?

public class Foo { 
    public String bar(String x) { 
    return "string " + x; 
    } 
    public String bar(Integer x) { 
    return "integer " + x; 
    } 
} 

我怎麼能繼承美孚Clojure中和只覆蓋了吧(String)方法,但重用原來的Foo類的吧(整數)。事情是這樣的(但是這不會工作):

(let [myFoo (proxy [Foo] [] 
       (bar [^String x] (str "my " x)))] 
    (println "with string: " (.bar myFoo "abc")) 
    (println "with integer: " (.bar myFoo 10))) 

這個例子會打印:

with string: my abc 
with integer: my 10 

,但我想獲得的效果:

with string: my abc 
with integer: integer 10 
+0

我沒有答案,但你的問題激發我讀「proxy_core.clj」,這讓我稍微聰明一些,所以謝謝! :) – 2011-05-19 12:17:26

+0

我其實也是這麼做的。如果其他人感興趣'proxy_core.clj'是[here](https://github.com/clojure/clojure/blob/master/src/clj/clojure/core_proxy.clj)。 – 2011-05-19 14:11:12

回答

3

我m猜測這不是你的意思,但同時,你可以明確地檢查參數的類型,並使用proxy-super來調用Foo上的原始方法。

(let [myFoo (proxy [Foo] [] 
       (bar [x] 
       (if (instance? String x) 
        (str "my " x) 
        (proxy-super bar x))))] 
    (println "with string: " (.bar myFoo "abc")) 
    (println "with integer: " (.bar myFoo 10))) 
+0

我其實已經嘗試過這個,但得到了AbstractMethodError和其他奇怪的東西(我做這件事的真實情況當然要複雜得多)。我必須再試一次。謝謝! – 2011-05-19 05:46:11

+0

@ alex-miller如果Integer欄調用回到String欄中,則必須小心。這也不適用於這種方法。但@ jonathan-tran是正確的:這是做到這一點的唯一方法。 – kotarak 2011-05-19 09:14:14

相關問題