2

注入されたフィールドにクラスのジェネリック パラメータを使用したいのですが、バインドされていないキーについて Guice が文句を言います。Test2 にフィールドを挿入することは可能ですか?

例:

public static class Test1<T1> {
    }

    public static class Test2<T2> {
        @Inject
        public Test1<T2> test;
    }

    public static void main(String[] args) throws Exception {
        Injector injector = Jsr250.createInjector(Stage.PRODUCTION, new TestModule());
        Test2<String> test = injector.getInstance(Key.get(new TypeLiteral<Test2<String>>(){}));
    }

    private static class TestModule extends AbstractModule {
        @Override
        protected void configure() {
            bind(new TypeLiteral<Test1<String>>(){}).toInstance(new Test1<String>());
            bind(new TypeLiteral<Test2<String>>(){}).toInstance(new Test2<String>());
        }
    }
4

1 に答える 1

0

まあ、これはJavaジェネリックにとってはやり過ぎです。インジェクションがなくてもコードは機能しません.cuz Test1<T2>cannot match Test1<String>. 別のアプローチを検討する必要があります。次のような注釈バインディングを使用してみてください。

public static class Test2 {
        @Inject @Named("T2")
        public Test1<someGenericInterface> test;
    }

bind(new TypeLiteral<Test1<someGenericInterface>>(){}).annotatedWith(Names.named("T2")).toInstance(new Test1<T2>()); //T2 implements someGenericInterface
bind(new TypeLiteral<Test1<someGenericInterface>>(){}).annotatedWith(Names.named("T1")).toInstance(new Test1<T1>()); //T1 implements someGenericInterface

または特定のプロバイダープロバイダー バインディングを実装するか、 MapBinderを使用します

于 2013-08-21T10:26:27.457 に答える