NoSuchMethodError вместо вызова правильного метода - PullRequest
0 голосов
/ 02 мая 2019

Я столкнулся со странным поведением.Следующий код:

private void setSegments(Set<Long> segments) {
    this.segments = ImmutableSet.copyOf(segments);
}

throws

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.

спасибо за любые идеи

1 Ответ

0 голосов
/ 02 мая 2019

Вы определенно не используете правильный файл guava.jar во время выполнения. Или, может быть, где-то в ваших переходных зависимостях, найдена более старая версия Guava. И эта версия класса ImmutableSet загружается до правильной версии (в любом случае у вас конфликт версий).

Вы можете записать фактическое местоположение файла jar, из которого загружается эта «сломанная» версия класса ImmutableSet, с помощью

    URL res = System.class.getResource("/com/google/common/collect/ImmutableSet.class");
    System.out.println(res);

изменить : изменил код

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...