2

これは機能します:

public static class SomeGenericType<T> {
    private TypeLiteral<T> type; 

    @Inject
    public SomeGenericType(TypeLiteral<T> type) {
        this.type = type; 
    }

    public Class<? super T> getType() {
        return type.getRawType();
    }
}

Guiceは、次の場合に文字列を表すTypeLiteralを自動的に挿入します。

@Inject SomeGenericType<String> foo;

しかし、Assisted Injectで同じことを試みる場合:

public static interface FooFactory<T> {
    Foo<T> create(String name);
}

public static class Foo<T> {

    @AssistedInject
    public Foo(TypeLiteral<T> type, @Assisted String name) {
        ....

私のモジュールは次のようになります:

public static class TestMod extends AbstractModule {
    @Override
    protected void configure() {
        install(new FactoryModuleBuilder().build(new TypeLiteral<FooFactory<String>>(){}));
    }   
}

モジュールのインストール中に例外が発生します:

TypeLiteral<T> cannot be used as a Key, it is not fully specified. 

私が注入しようとしているのは確かにTypeLiteralであり、それを削除すると汎用ファクトリが正常に機能するため、問題が発生します。

それで、私はおそらく今のところ自分の工場を転がすだけですが、これがうまくいくかどうか知りたいですか?FactoryModuleBuilderを少し異なる方法で使用することの問題ですか?

4

1 に答える 1

5

FooFactoryのインスタンスにどのようにアクセスしていますか?以下のコードにバリエーションを作成しましたが、うまくいきました。

public class AnotherGuiceTest {
    public static void main( String[] args ) {
        Injector i = Guice.createInjector( new TestMod() );
        FooFactory<String> ff = i.getInstance( Key.get( new TypeLiteral<FooFactory<String>>() {} ) );
        ff.create( "myname" );
    }
}

interface FooFactory<T> {
    Foo<T> create( String name );
}

class Foo<T> {

    @Inject
    public Foo( TypeLiteral<T> type, @Assisted String name ) {
        System.out.println( type.getRawType() );
        System.out.println( name );
    }
}

class TestMod extends AbstractModule {
    @Override
    protected void configure() {
        install( new FactoryModuleBuilder().build( new TypeLiteral<FooFactory<String>>() {} ) );
    }
}

出力:

class java.lang.String
myname

ファクトリ内の複数のコンストラクター用ではなく@Inject通常のアノテーションを使用したことに注意してください。これは、インスタンスを直接注入する場合にも機能します。@AssistedInject

public class AnotherGuiceTest {
    public static void main( String[] args ) {
        Injector i = Guice.createInjector( new TestMod() );
        AppClass ac = i.getInstance( AppClass.class );
    }
}

class AppClass {
    @Inject
    public AppClass( FooFactory<String> fooFactory ) {
        fooFactory.create( "test" );
    }
}

出力:

class java.lang.String
test
于 2012-04-19T16:21:07.247 に答える