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
、グアバのクラスもロードされているため、何が原因なのかわかりません。