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