2014-09-21 1 views
2
바르가 비어있을 때 가변 인자를 받아들이고,이 작품

Clojure의 : 자바 방법에 대한 목록에 가변 인자를 확장하는 방법

(defn foo [var1 var2 & vars] 
    (let [bar (.foo var1)] 
     (.gaz bar var2 vars))) 

자바 메소드 호출에 사람들을 전달하는 Clojure의 기능 일하고

바르가 메서드 호출에 가변 인자 목록에 보간/접합되는이 arent처럼 내가 바르에 뭔가를 넣을 때,하지만, 내가

java.lang.ClassCastException: Cannot cast clojure.lang.ArraySeq to [Ljava.lang.Object; 

을받을 것 같습니다. 어떻게해야합니까? 난 둘 다

(foo a b) 

(foo a b c d e f) 

로 사용하려는 그리고 이것이 정확히 오류 메시지가 요구되는 유형 반환이

(.gaz bar b c d e f) ;; <- note the list is embedded 
+0

는'.gaz' 가변 인자입니다 : 그렇다면, 당신이 필요로하는 모든는 다음과 같습니다? – noisesmith

+0

"목록으로 확장"이란 무엇을 의미합니까 - 변환 하시겠습니까? 시퀀스에서 위치 인수로 분리합니까? – noisesmith

답변

4

참고 호출 한 :

user> (into-array Object [1 2 3]) 
#<Object[] [Ljava.lang.Object;@571bc284> 

컨텍스트에서, 난 .gaz 가능성이 높습니다 가정합니다.

(.gaz bar var2 (into-array Object vars))

+0

감사합니다, 매력처럼 작동합니다. 왜 작동하는지 완전히 이해할 수는 없지만 배열로 읽어 들일 것입니다. –

+1

varargs에 필요한 인수는 일반적인 Clojure 영속 콜렉션이 구현하지 않는 클래스로 예상됩니다. 보다 원시적 인 변경 가능한 클래스로 변환함으로써, 우리는 jvm의 요구 사항을 만족시킵니다. – noisesmith