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>
通常不需要为像这样的东西添加类型提示(因为arity足够解决问题)。然而,这个特定的方法提供了String[]和Location[]的重载。我并不反对您的原始要求,只是在尝试澄清哪些情况下这是有必要的。

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