Странная ошибка впрыска 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?