Странная ошибка впрыска Guice

У меня очень странная ошибка при попытке ввести конструктор с помощью Guice. В конструкторе есть отдельная строка:

@Inject
public RoundRobinAssigner(
        ... arguments
        ) {
            ...stuff

    assignments = Sets.synchronizedNavigableSet(Sets.<CountingEntry<String>>newTreeSet());
}

Это терпит неудачу при инъекции со следующим.

1) Error injecting constructor, java.lang.NoSuchMethodError: com.google.common.collect.Sets.synchronizedNavigableSet(Ljava/util/NavigableSet;)Ljava/util/NavigableSet;
  at edu.harvard.econcs.turkserver.util.RoundRobinAssigner.<init>(RoundRobinAssigner.java:46)
  at edu.harvard.econcs.turkserver.util.RoundRobinAssigner.class(RoundRobinAssigner.java:40)
  while locating edu.harvard.econcs.turkserver.util.RoundRobinAssigner

Но если я уберу Sets.synchronizedNavigableSet() упаковка, вещи впрыскивают просто отлично.

@Inject
public RoundRobinAssigner(
        ... arguments
        ) {     
            ...stuff

    assignments = Sets.<CountingEntry<String>>newTreeSet();

}

Понятно, что это неоптимально, так как я хочу использовать синхронизированный набор. Есть ли какая-то причина, по которой инструктор, называемый Guice, будет вести себя иначе, чем нормальный? Ни один из этих кодов не имеет проблем с компиляцией и Sets класс из гуавы тоже был загружен, поэтому я понятия не имею, что вызывает это.

1 ответ

Решение

Я подозреваю, что вы просто видите проблему, которую иначе видели бы в другом месте - в основном потому, что Guice участвует при загрузке класса с помощью отражения, ошибка "времени соединения" Sets.synchronizedNavigableSet недоступность показывается в контексте Guice, а не в "нормальном" вызове конструктора.

synchronizedNavigableSet был представлен только в 13.0 - возможно ли, что вы компилируете против этого, но работаете со старой версией Guava?

Другие вопросы по тегам