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

欢迎!请参阅关于页面以了解如何工作的更多信息。

+2
Java互操作

Google Guava 30.1为TreeRangeSet定义了这两个addAll重载

public void TreeRangeSet.addAll(RangeSet)
public default void RangeSet.addAll(Iterable<Range>)

以下编译时没有错误或警告

(import [com.google.common.collect Range RangeSet TreeRangeSet])

(defn example []
  (let [container (TreeRangeSet/create)
        temp (TreeRangeSet/create ^Iterable (list (Range/closed 1 2)))]
     (.addAll container ^RangeSet temp)))

但是调用示例失败,并抛出运行时错误,指出TreeRangeSet没有实现Iterable。据我所知,这个错误发生是因为Clojure编译器发出了对第二个重载的调用(尽管有类型提示)。经过一些实验,我认为这是由于第一个重载对isBridge返回true;Reflector.getMethods将不会返回它,因为第二个重载不是非桥方法。

所以有两个问题:是否有生成对第一个重载的调用的方法,如果没有,是否应该有?

(顺便说一下,在上面的temp初始化中,我想使用

(let [temp (TreeRangeSet/create ^Iterable [(Range/closed 1 2)])

但它产生了反射警告。我认为这是一个CLJ-1929的例子。)

1回答

+1
...