8

在 :constructors 映射和后续的 -init 定义中,我如何表示一个可变参数构造函数(假设超类有多个构造函数,其中一个是可变参数)?

4

2 回答 2

2

由于 varargs 本质上是 Object 数组的语法糖,您可以只使用“[Ljava.lang.Object;” 作为构造函数参数的类型。

这是一些示例代码:

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

这就是它在 REPL 中的样子

user=> @(t.vtest. (into-array Object ["A" "B" 1 2]))
first element of args A total elements 4
["A" "B" 1 2]
于 2012-02-07T14:37:41.850 回答
1

由于 clojure 目前不支持它,您需要使用以下方法对其进行修补:https://groups.google.com/forum/#!topic/clojure/HMpMavh0WxA。

并将其与新的元标记一起使用:

(ns t.vtest 
  (:gen-class 
   :implements   [clojure.lang.IDeref]
   :init init
   :state state
   :constructors {^:varargs ["[Ljava.lang.Object;"] []} 
  ))
于 2013-09-11T09:48:46.927 回答