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