3

以下作品。结果是“你好世界”

  (def ^Callable f (fn [] "hello world"))
  (let [e (java.util.concurrent.Executors/newSingleThreadExecutor)]
    (try
      (.get (.submit e f))
      (finally (.shutdown e))))

但以下没有。结果getnil

(def e (java.util.concurrent.Executors/newSingleThreadExecutor))
(.get (.submit e f))

为什么?f我通过用有副作用的东西替换它来检查它是否被调用。我能看到的唯一区别是在一个和另一个中e使用绑定。letdef

另一个问题。如果我没有第一个示例的^Callable类型提示,f则安静地返回nil。它不应该为提交调用抛出异常“找到多个匹配方法”,因为f两者都是Runnableand Callable?如果我定义如下f使用let,则抛出异常

(let [e (java.util.concurrent.Executors/newSingleThreadExecutor)]
  (let [f (fn [] "hello world2")]
    (try
      (.get (.submit e f))
      (finally (.shutdown e)))))

谢谢

4

1 回答 1

5

问题是e无法推断的类型

(def e (java.util.concurrent.Executors/newSingleThreadExecutor))

当我将其更改为

(def ^java.util.concurrent.ExecutorService e (java.util.concurrent.Executors/newSingleThreadExecutor))

然后(.get (.submit e f))给出正确的答案"hello world"e当使用 a 定义时,clojure 以某种方式推断出正确的类型let,因此不需要类似的类型提示。

设置*warn-on-reflection*true有助于调试。

于 2013-09-07T18:21:09.290 回答