尝试使用 Guice 注入(inject)构造函数时,我遇到了一个非常奇怪的错误。构造函数中有一行如下:
@Inject
public RoundRobinAssigner(
... arguments
) {
...stuff
assignments = Sets.synchronizedNavigableSet(Sets.<CountingEntry<String>>newTreeSet());
}
注入(inject)以下内容时失败。
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)就没问题了。
@Inject
public RoundRobinAssigner(
... arguments
) {
...stuff
assignments = Sets.<CountingEntry<String>>newTreeSet();
}
显然,这是次优的,因为我想使用同步集。有什么理由可以解释为什么被称为 Guice 的讲师的行为与普通讲师有任何不同?这些代码都没有任何编译问题,而且 guava 中的 Sets
类也已加载,所以我不知道是什么原因造成的。
最佳答案
我怀疑你只是看到了一个你会在其他地方看到的问题 - 基本上是因为在通过反射加载类时涉及 Guice, 的“链接时间”错误Sets.synchronizedNavigableSet
不可用显示在 Guice 的上下文中,而不是在“正常”构造函数调用中。
synchronizedNavigableSet
仅在 13.0 中引入 - 是否有可能您正在编译,但运行针对旧版本的 Guava?
关于java - 奇怪的Guice注入(inject)错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15215965/