2013-09-07 3 views
3

에 다음 작품을 기능을 제출 한 후 미래의 결과를 얻기. 그 결과에 "Hello World"는 java.util.concurrent.ExecutorService

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

하지만 다음은하지 않습니다. get의 결과는

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

nil입니까? 나는 f이 부작용이있는 무언가로 대체하여 호출되는 것을 확인했습니다. 내가 볼 수있는 유일한 차이점은 e 하나와 다른 deflet를 사용하여 결합되어 있다는 점이다.

또 다른 질문입니다. f에 대한 ^Callable 유형 힌트가없는 경우 첫 번째 예제는 자동으로 nil을 반환합니다. f 모두 RunnableCallable 때문에 그것은 제출 호출에 대해 "하나 개 이상의 일치하는 메소드가 발견"예외가 발생하지 않나요? 나는 다음 예외가 발생 다음과 같은

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

감사

답변

4

문제를 let를 사용하여 f을 정의하면 내가이를 변경할 때 e의 유형은

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

에서 유추 할 수없는되었다

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

th ko (.get (.submit e f)) 대답은 "hello world"입니다. 어떻게 든 클로우 저는 elet을 사용하여 정의 될 때 올바른 유형을 추론하므로 비슷한 유형의 힌트가 필요하지 않습니다. true*warn-on-reflection* 설정

이를 디버깅하는 데 도움이.