2

尝试使用 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来自 guava 的类也已加载,所以我不知道是什么原因造成的。

4

1 回答 1

8

怀疑你只是看到了一个你会在其他地方看到的问题——基本上是因为在通过反射加载类时涉及到 Guice,所以“链接时间”Sets.synchronizedNavigableSet不可用的错误显示在 Guice 的上下文中而不是在“正常”构造函数调用。

synchronizedNavigableSet仅在 13.0 中引入 - 您是否有可能针对它进行编译,但针对旧版本的 Guava运行?

于 2013-03-05T04:46:24.580 回答