NoSuchMethodError而不是调用正确的方法

时间:2019-05-02 10:25:32

标签: java override nosuchmethoderror

我遇到了一个奇怪的行为。以下代码:

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。

感谢任何想法

1 个答案:

答案 0 :(得分:0)

您肯定不是在运行时使用正确的guava.jar文件。或者,也许在您的传递依赖项中的某个位置,找到了较旧版本的Guava。而ImmutableSet类的版本是在正确的版本之前 加载的(无论如何您都存在版本冲突)。

您可以使用以下方式转储jar文件的实际位置:

ImmutableSet

修改:更改了代码