【问题标题】:How to instantiate a Stream.Builder class in clojure? (using java 9)如何在 clojure 中实例化 Stream.Builder 类? (使用Java 9)
【发布时间】:2018-03-30 12:24:27
【问题描述】:

我正在按照这个例子来启动一个 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

我有什么遗漏的吗?

【问题讨论】:

  • 字符串或流生成器? -> 我正在按照这个例子来启动一个 String.Builder:
  • Stream.Builder。谢谢你的收获。
  • 您还检查过您的 Stream 类路径吗? (import java.util.stream.Stream) 我没问题
  • 我用的是java 9,我试试java 8
  • 是的,试试我使用 java 和 clojure 8

标签: clojure


【解决方案1】:

快速研究让我想到了这个问题: 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 中的修复。

【讨论】:

    【解决方案2】:

    非常有帮助,感谢我们这些坚持使用 Clojure 8 但需要使用比 1.8 更新的 Java 的人。

    对于它的价值,如果argtypes 不为空,上述答案中的宏将不起作用,因为所写的宏构造了一个不带引号的类列表作为 .getMethod 的第三个参数,并且 Clojure 尝试调用列表中的第一个类作为 IFn。我需要将宏重新定义为:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-29
      • 1970-01-01
      • 1970-01-01
      • 2013-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多