Вот один из способов сделать это:
public class FooModule extends PrivateModule {
@Retention(RUNTIME) @BindingAnnotation
private @interface Internal {}
@Override protected void configure() {
bind(new TypeLiteral<IFoo<SomeType>>(){}).annotatedWith(Internal.class)
.to(new TypeLiteral<Foo<SomeType>>(){});
}
@Provides @Exposed IFoo<SomeType> provideFoo(@Internal IFoo<SomeType> foo) {
return new FooWrapper<SomeType>(foo);
}
}
Другая вещь, которая может работать хорошо, это добавить общую аннотацию, такую как @Wrapped
, а затем объявить конструктор FooWrapper
следующим образом:
@Inject public FooWrapper(@Wrapped IFoo<T> foo) { ... }
Тогда в вашем личном модуле вы можете связать Foo
с аннотацией @Wrapped
, связать и выставить FooWrapper
как обычно, без необходимости использования метода @Provides
.
Вполне возможно, есть лучшие способы сделать это, о которых я еще не думал. Также помните, что перехват методов часто является хорошим способом украшения реализаций интерфейса и другим поведением.