簡體   English   中英

如何在Clojure中使用重載方法代理Java類?

[英]How can I proxy a Java class with overloaded methods in Clojure?

例如,給定一個Java類,如:

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

我如何在Clojure中子類化Foo並僅覆蓋bar(String)方法,但重用原始Foo類中的bar(Integer)。 像這樣的東西(但這不起作用):

(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

我猜這不是你的意思,但在此期間,你可以顯式檢查參數的類型,並使用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)))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM