clojure - 如何在 clojure 中实例化 Stream.Builder 类? (使用java 9)

标签 clojure

我按照此示例启动 Stream.Builder:

http://www.java2s.com/Tutorials/Java/java.util.stream/Stream.Builder/Stream.Builder.build_.htm

(def b (doto (Stream/builder)
          (.accept "a")
          (.accept "b")
          (.accept "c")
          (.accept "d")
          (.accept "e")))

但是,我得到了这个:

Unhandled java.lang.IncompatibleClassChangeError
 Method
 java.util.stream.Stream.builder()Ljava/util/stream/Stream$Builder;
 must be InterfaceMethodref constant

我有什么遗漏的吗?

最佳答案

快速研究让我发现了这个问题: https://dev.clojure.org/jira/browse/CLJ-2284

因此解决方法如下所述:

(import 'java.util.stream.Stream)

(defmacro interface-static-call
  [sym & argtypes]
  `(let [m# (.getMethod ~(symbol (namespace sym))
                        ~(name sym)
                        (into-array Class ~argtypes))]
     (fn [& args#]
       (.invoke m# nil (to-array args#)))))

(doto ((interface-static-call Stream/builder))
  (.accept "a")
  (.accept "b")
  (.accept "c")
  (.accept "d")
  (.accept "e"))

;;=> #object[java.util.stream.Streams$StreamBuilderImpl 0x121300ed "java.util.stream.Streams$StreamBuilderImpl@121300ed"]

在 java 9 上对我有用

所以我想我们应该等待 clojure 的修复。

关于clojure - 如何在 clojure 中实例化 Stream.Builder 类? (使用java 9),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49574394/

相关文章:

postgresql - 如何使用 Luminus 连接到 Heroku 中的 PostgreSQL?

clojure - 何时在 Clojure 中使用 reduce-kv 而不是 reduce?

emacs - 关闭 nrepl 的正确方法是什么?

CLR 上的 Clojure

testing - Clojure 测试 : global fixtures

clojure - 如何获取 Clojure 中命名空间中定义的所有函数?

clojure - 构建目录树

clojure - 在配置文件中正确使用 Environ 库

clojure - 如何在 REPL 中重新加载 clojure 文件

java - 来自 clojure.java.api.Clojure 的意外行为