2024年Clojure现状调查中分享您的想法!

欢迎!请查看关于页面以了解该工具的一些更多信息。

< span class="qa-netvote-count-data">0 投票
< span class="qa-q-view-when"> < span class="qa-q-view-where"> 编译器 < span class="qa-q-view-who">
我正在尝试编写一个宏,该宏使用一些反射来生成 reify 表达式。

clojure.reflect 生成与 'java.util.Iterator<>' 类似的类型符号

不幸的是,编译器不接受类型提示中的 <> 语法

(reify Iterable (^{:tag java.util.Iterator} iterator [this] nil)) ; 工作正常

(reify Iterable (^{:tag java.util.Iterator<>} iterator [this] nil)) ;; 失败
CompilerException java.lang.RuntimeException: java.lang.ClassNotFoundException: java.util.Iterator<>, compiling:(NO_SOURCE_PATH:1325)

看起来编译器本应该足够了解 <> 以至于可以移除它,而不仅仅是拒绝它。这将使编写涉及类型提示和反射的正确宏变得容易得多。

我一直使用的弥补方法是

(defn hint
  "clojure.reflect 使用尖括号标记泛型,但
   编译器不支持类型提示中的泛型"
  [obj tag]
  (let [tag (-> tag .toString (.replace "<>" "") symbol)]
    (with-meta obj {:tag tag}));)

2 答案

< span class="qa-netvote-count-data">0 投票
< span class="qa-a-item-when"> < span class="qa-a-item-who">

评论由:bbloom 发布

对不起,我之前弄错了。问题确实是存在的,但问题在于数组,而不是泛型

我的解决方案是无用的... :-/

< span class="qa-netvote-count-data">0 投票
< span class="qa-a-item-when"> < span class="qa-a-item-who">
参考:https://clojure.atlassian.net/browse/CLJ-938(由bbloom报告)
...