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

欢迎!请参阅关于页面了解有关如何使用此功能的一些更多信息。

+6
Java互操作
重新标记

目前,将数组转换为需要类型提示,并且需要首先指定目标类。

如果编译器能为此处理事就太好了。

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
...