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

欢迎!请查看关于页面以了解如何使用这个设施的相关信息关于

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