我遇到了一个奇怪的行为。以下代码:
private void setSegments(Set<Long> segments) {
this.segments = ImmutableSet.copyOf(segments);
}
抛出
java.lang.NoSuchMethodError: com.google.common.collect.ImmutableSet.copyOf(Ljava/util/Collection;)Lcom/google/common/collect/ImmutableSet;
我通过添加以下代码片段,通过反射检查了类的内容:
try {
Class c = ImmutableSet.class;
Method[] m = c.getDeclaredMethods();
for (int i = 0; i < m.length; i++) {
LOGGER.error("method: " + m[i].toString());
}
} catch (Throwable e) {
System.err.println(e);
}
其中包括所有其他打印方法
Segments:method: public static com.google.common.collect.ImmutableSet com.google.common.collect.ImmutableSet.copyOf(java.util.Iterator)
Segments:method: public static com.google.common.collect.ImmutableSet com.google.common.collect.ImmutableSet.copyOf(java.lang.Iterable)
我不明白为什么不调用带有Iterable参数的方法。毕竟,Set扩展了实现Iterable的Collection。
感谢任何想法
答案 0 :(得分:0)
您肯定不是在运行时使用正确的guava.jar
文件。或者,也许在您的传递依赖项中的某个位置,找到了较旧版本的Guava。而ImmutableSet
类的版本是在正确的版本之前 加载的(无论如何您都存在版本冲突)。
您可以使用以下方式转储jar文件的实际位置:
ImmutableSet
修改:更改了代码