Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 将函数提交到java.util.concurrent.ExecutorService后获取未来结果_Clojure_Java.util.concurrent - Fatal编程技术网

Clojure 将函数提交到java.util.concurrent.ExecutorService后获取未来结果

Clojure 将函数提交到java.util.concurrent.ExecutorService后获取未来结果,clojure,java.util.concurrent,Clojure,Java.util.concurrent,下面的工作。结果是“你好,世界” 但以下情况并非如此。get的结果是nil (def e (java.util.concurrent.Executors/newSingleThreadExecutor)) (.get (.submit e f)) 为什么??我检查了f是否被调用,并将其替换为具有副作用的内容。我能看到的唯一区别是e在其中一个中使用let,在另一个中使用def进行绑定 另一个问题。如果我没有f的^Callable类型提示,那么第一个示例会安静地返回nil。由于f既是Runnabl

下面的工作。结果是“你好,世界”

但以下情况并非如此。
get
的结果是
nil

(def e (java.util.concurrent.Executors/newSingleThreadExecutor))
(.get (.submit e f))
为什么??我检查了
f
是否被调用,并将其替换为具有副作用的内容。我能看到的唯一区别是
e
在其中一个中使用
let
,在另一个中使用
def
进行绑定

另一个问题。如果我没有
f
^Callable
类型提示,那么第一个示例会安静地返回
nil
。由于
f
既是
Runnable
又是
Callable
,它不应该为submit调用抛出异常“找到多个匹配方法”吗?如果我像下面那样使用
let
定义
f
,则会引发异常

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

谢谢

问题在于无法在中推断出
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”
。当使用
let
定义
e
时,clojure推断出正确的类型,因此不需要类似的类型提示

*反射时警告*
设置为
true
有助于调试此问题

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