请分享您的想法至 Clojure 2024 状态调查!

欢迎!请查看 关于 页面了解更多如何使用本网站的信息。

+6
Java 互操作
重标记

目前,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>
by
通常情况下,您不需要为此类事物添加类型提示(因为基数足够解决)。但是,这个特定的方法对String[]和Location[]有重载函数。我对您的原始请求没有异议,只是想澄清哪些情况下这很重要。

我认为在目前没有更多编译器级别的支持下进行这项操作并非易事。
by
最近遇到的这些
* netty Http2ServerUpgradeCodec构造函数(Http2FrameCodec, ChannelHandler...)
* netty ApplicationProtocolConfig构造函数(Protocol, SelectorFailureBehavior, SelectedListenerFailureBehavior, String...)
* netty SslContextBuilder/forServer(PrivateKey, String, X509Certificate...)
by
@valerauko 那些是可变参数方法吗?
by
是的(尽管这只是数组重载的一种情况,对于其他数组重载也会出现相同的问题)。
0
...