2012-04-18 3 views
2

を使用する場合は、この作品:Guiceの、インジェクトTypeLiteral <T> @AssistedInject

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がStringを表す注入:

@Inject SomeGenericType<String> foo; 

しかし、支援を注入して同じことをしよう:

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

どのように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>>() {})); 
    } 
} 

出力:私はがで複数のコンストラクタのためだと思うむしろ@AssistedInjectより定期@Inject注釈を使用

class java.lang.String 
myname 

注意工場。

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 
+0

なるほど...そう、それはセットアップの問題だったあなたは、直接インスタンスを注入する場合にも動作します。それを試して答えてくれてありがとう。それは、guice-assistedinject-3.0.jarの代わりにGINに関連するjarファイル(guice-assistedinject-snapshot.jar)があるからです(サイドノート、定期的な補助注入はジェネリックでは使えないようです) – aidanok

関連する問題