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的例子。)