请在2024年 Clojure 调查!(英文)中分享您的想法!

欢迎!请参阅关于页面获取更多关于这个论坛如何运作的信息。

+6
Java 互操作
重标记

目前,除了第一次需要指定目标类之外,into-array 的返回值还需要类型提示。为数组类型添加类型提示也并非易事(使用了奇怪且非常冗长的 ^"[Lorg.clojure.MyClass;" 语法)。

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

2 个回答

0

您能提供一个例子吗?

这是一个在我们的生产环境中运行的各种项目中散乱使用的示例,它是为了方便与执行数据库迁移(Flyway)的Java库进行交互。

<pre>
;; 当你在 Clojure 中工作,与数组操作相关(并希望利用性能
;; 通过使用类型提示进行改进),您必须确保编译器已知道数组类型。
;; 原始数组的类型提示是 ^longs、^chars、^doubles 等;对于对象数组,您必须使用一个不便于书写的构造,如 ^"[Ljava.lang.String;"
;;


(定义私有函数 ^: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
...