2012-04-18 49 views
2

时,此工作:吉斯,注射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(); 
    } 
} 

吉斯自动注入的TypeLiteral代表字符串,当我做:

@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>>() {})); 
    } 
} 

输出:

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

啊哈..所以这是一个设置问题,如果你直接注入实例这也适用。感谢您花时间测试它并回答。原来,这是因为我有一个涉及GIN的jar,guice-assistedinject-snapshot.jar而不是guice-assistedinject-3.0.jar(注意,常规的辅助注入似乎可以在这个jar中工作,而不是在泛型中) – aidanok 2012-04-19 19:31:21