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

4

1 に答える 1

8

別の場所で見られる問題を見ているだけだと思います-基本的に、リフレクションを介してクラスをロードするときにGuiceが関与しているため、使用できないという「リンク時間」エラーSets.synchronizedNavigableSet、 「通常の」コンストラクター呼び出し。

synchronizedNavigableSet13.0でのみ導入されました-それに対してコンパイルしているが、古いバージョンのGuavaに対して実行している可能性はありますか?

于 2013-03-05T04:46:24.580 に答える