【问题标题】:clojure gen-class varargs constructorclojure gen-class 可变参数构造函数
【发布时间】:2012-02-15 14:39:58
【问题描述】:

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

【问题讨论】:

    标签: clojure java-interop clojure-java-interop gen-class


    【解决方案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;"] []} 
      ))
    

    【讨论】:

      【解决方案2】:

      由于 varargs 本质上是对象数组的语法糖,您可以只使用“[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]
      

      【讨论】:

      • 它不能解决有问题的问题。它不是定义可变参数方法,而是生成方法接受数组。这不一样。不同之处在于,可变参数由生成的字节码中的特殊 ACC_VARARGS 操作码标记,而 clojure 目前不支持。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-05
      • 2016-09-02
      • 2016-01-02
      • 2020-04-04
      • 2018-08-28
      • 2018-05-18
      相关资源
      最近更新 更多