1

Guice 3.0を使用して、特定のチェック済み例外をスローできるプロバイダーを挿入しようとしています。だから私はThrowingProviders拡張機能を使用しています。

プロバイダーのインターフェースを作成しました:

public interface IMyProvider<T> extends CheckedProvider<T> 
{
    @Override
    T get() throws MyException;
}

そしてその実装:

public class MyProvider implements IMyProvider<List<SomeType>> 
{
    @Override
    public List<SomeType> get() throws MyException                        
    {
        //...
    }
}

プロバイダーを注入するオブジェクトに@Injectアノテーションを使用します。

@Inject
public SomeConstructor(IMyProvider<List<SomeType>> myProvider)
{
    //...
}

今、私の問題は:このプロバイダーをバインドする方法ですか?

ジェネリックが使用されているので、私は使用について考えていますTypeLiteral

bind(MyProvider.class);
ThrowingProviderBinder.create(binder())
                      .bind(IMyProvider.class, new TypeLiteral<List<SomeType>>(){})
                      .to(MyProvider.class);

しかしTypeLiteral、このbind()メソッドの有効な引数ではないようです。

私は何かが足りないのですか?

アップデート :

回避策を見つけました。拡張するクラスを作成するArrayList<SomeType>ことで、プロバイダーをバインドできます。

public class SomeTypeList extends ArrayList<SomeType>

bind(MyProvider.class);
ThrowingProviderBinder.create(binder())
                      .bind(IMyProvider.class, SomeTypeList.class)
                      .to(MyProvider.class);

SomeTypeListしかし、そのクラスが必要ない場合は、より簡単になります。

4

1 に答える 1

2

ネイティブに実装されていないTypeインスタンスを探しています。TypeLiteral

私はこれを直接操作していませんが、GuiceはTypesクラスを提供し、メソッドもありTypeLiteral.getTypeます。次のいずれかを試してください。

  • Types.listOf(SomeType.class)
  • Types.newParameterizedType(List.class, SomeType.class)
  • (new TypeLiteral<List<SomeType>>() {}).getType()

私の好みが最初で、次のようになります。

ThrowingProviderBinder
    .create(binder())
    .bind(IMyProvider.class, Types.listOf(SomeType.class))
    .to(MyProvider.class);
于 2012-11-04T19:47:02.857 に答える