2012-01-21 19 views

Odpowiedz

1

Ponieważ varargs są w istocie składnikami cukru dla tablic Object, można po prostu użyć "[Ljava.lang.Object;" jako typ parametru konstruktora.

Oto niektóre przykładowy kod:

(ns t.vtest 
    (:gen-class 
    :implements [clojure.lang.IDeref] 
    :init init 
    :state state 
    :constructors {["[Ljava.lang.Object;"] []})) 
    ;;          ^----------------------- 
    ;; You should put "[Ljava.lang.Object;" for superclass varargs constructor here 
    ;; I left it blank for the sake of working example 

(defn -init 
    [args] 
    (println "first element of args" (aget args 0) "total elements" (alength args)) 
    [[] (into [] args)]) 

(defn -deref 
    [this] 
    (.state this)) 

i tak to wygląda w REPL

user=> @(t.vtest. (into-array Object ["A" "B" 1 2])) 
first element of args A total elements 4 
["A" "B" 1 2] 
+0

Nie rozwiązuje problemu określonego w pytaniu. Zamiast definiowania metody vararg generuje ona metodę akceptującą tablicę. To nie to samo. Różnica polega na tym, że vararg jest oznaczony specjalnym opscodem ACC_VARARGS w wygenerowanym kodzie bajtowym, którego clojure obecnie nie obsługuje. – Lambder