2024 Clojure 状况调查! 分享您的看法。

欢迎!有关详细信息,请参阅 关于 页面。

+6
Java 互操作
重标记

目前 into-array 的返回值除了需要指定目标类之外,还需要类型提示。数组类型的类型提示也不是一件简单的事(奇特且极度冗长的 ^"[Lorg.clojure.MyClass;" 语法)。

如果编译器能帮用户处理这一点,那就太棒了。

2 个答案

0

能举例说明吗?

这里是一个例子,我在我们生产环境中各种项目中散见,其目的是为了与一个执行数据库迁移的 Java 库(Flyway)进行互操作

<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>
通常情况下,您不需要为这类事物提供类型提示(因为arity足以解决)。不过,这个特定的方法为String[]和Location[]提供了重载。我并不是反对您的原始请求,只是想澄清在哪里它很重要。

我认为在没有更多编译器级别支持的情况下,现在做这件事并不容易。
by
我最近遇到的问题
* netty Http2ServerUpgradeCodec 构造函数(Http2FrameCodec,ChannelHandler...)
* netty ApplicationProtocolConfig 构造函数(Protocol,SelectorFailureBehavior,SelectedListenerFailureBehavior,String...)
* netty SslContextBuilder/forServer(PrivateKey,String,X509Certificate...)
by
@valerauko 是不是那些可变参数方法?
by
是(虽然这只是一个数组重载的例子,其他数组重载也会出现同样的问题)。
0
...