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