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

欢迎!有关如何操作的一些更多信息,请查看关于页面。

+6
Java Interop
重新标记

当前情况下,into-array 的返回值需要类型提示,并且还需要最初指定目标类。类型提示数组类型也不是一件容易的事情(使用奇怪且极其冗长的 ^"[Lorg.clojure.MyClass;" 语法)。

如果编译器能帮用户处理这些就太好了。

2个答案

0

你能提供一个例子吗?

以下是我在一个生产环境中的多个项目中散布的一个示例,它是为了与一个进行数据库迁移的 Java 库(Flyway)进行互操作。

<pre>
;; 当你在 Clojure 中工作与数组(并希望利用性能
通过使用类型提示进行改进(;你可以确保编译器知道
数组的类型。原始数组的类型提示是
^longs, ^chars, ^doubles, 等等;对于对象数组,你需要使用一个
难以处理的构造,如 ^"[Ljava.lang.String;"

(defn ^:private flyway
  ^Flyway
  [datasource migration-locations]
  (Flyway. (doto ^FluentConfiguration
              (FluentConfiguration.)
              (.dataSource datasource)
             (.locations ^"[Ljava.lang.String;" (into-array String migration-locations)))))
</pre>
通常不需要为这样的东西设置类型提示(因为数量足够多可以解决)。这个特定的方法有 String[] 和 Location[] 的重载。我并不是不同意你的原始请求,只是在试图说明何时这很重要。

我认为没有更多的编译器级别支持很难做到这一点。
我最近遇到的情况
* netty Http2ServerUpgradeCodec 构造函数 (Http2FrameCodec, ChannelHandler...)
* netty ApplicationProtocolConfig 构造函数 (Protocol, SelectorFailureBehavior, SelectedListenerFailureBehavior, String...)
* netty SslContextBuilder/forServer (PrivateKey, String, X509Certificate...)
@valerauko 这些是不是可变参数方法?
是的(虽然这只是数组重载的一个例子,同样的问题也会出现在其他数组重载中)。
0
...