2012-01-21 30 views

Respuesta

1

Dado que los varargs son esencialmente azúcar de sintaxis para las matrices de Objetos, solo puede usar "[Ljava.lang.Object;" como el tipo de parámetro del constructor

He aquí algunos ejemplos de código:

(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)) 

y así es como se ve en REPL

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

No resuelve el problema mencionado en la pregunta. En lugar de definir un método vararg, genera un método que acepta matriz. Esto no es lo mismo. La diferencia es que el vararg está marcado por el código de operación especial ACC_VARARGS en el código de bytes generado, que no es compatible en este momento. – Lambder

Cuestiones relacionadas