proxy cant实现java.lang.Thread

时间:2017-02-22 20:32:40

标签: java clojure

我试图在java中实现它

window.addWindowListener(new WindowAdapter() {
            @Override
            public void windowDestroyNotify(WindowEvent arg0){
                new Thread(){
                    @Override
                    public void run(){
                        animator.stop();
                        System.exit(0);
                    }
                }.start();
            };
        });

就像在clojure中那样

 (.addWindowListener (proxy [WindowAdapter][]
                         (windowDestroyNotify [arg0]
                           (.start (proxy [java.lang.Thread][]
                                     (run
                                       (.stop ani)
                                       (System/exit 0)))))))

但是当我运行它时,它会给我这个错误

CompilerException java.lang.IllegalArgumentException: Don't know how to create ISeq from: clojure.lang.Symbol, compiling:     (program/core.clj:36:36)

36:36是“(proxy [java.lang.Thread]”开始的地方

为什么不能实现java.lang.Thread

2 个答案:

答案 0 :(得分:2)

该异常具有误导性,但问题在于代理runThread方法的实现,它缺少参数向量。

编译时的以下表达式会生成相同的异常:

(proxy [Thread] [] (run (inc 1)))

虽然这个没有:

(proxy [Thread] [] (run [] (inc 1)))

误导性错误是因为proxy宏如何解析其参数。

答案 1 :(得分:0)

从小块开始慢慢建立起来:

(let [t (Thread. #(println "going 1")) ]
  (.start t))

;=> going 1

(let [t (proxy [Thread] []
          (run [] (println "going 2")))
]
  (.start t))

;=> going 2

因此,您可以在周围的代码中看到问题不是proxyThread

更新

Juan首先发现问题是[]缺少的arglist run。通过阅读https://clojuredocs.org/clojure.core/proxy处的文档并慢慢构建示例,我自动在示例代码中获得了arglist。

我发现通过“综合”理解问题可以绕过许多问题。它往往更快更快比通过“分析”试图理解问题更容易,在那里你从成品开始,然后试着找出导致它出错的原因。