2012-07-31 52 views
2

我试图将Class<? extends SuperClass>绑定到​​,但我找不到任何合适的东西。在Guice中绑定泛型与通配符

其实我的绑定需要在Set<Class<? extends SuperClass>>,所以我测试了正常绑定和多重绑定,但我不能让他们中的任何一个正常工作。我想我正确地遵循了这个问题:Using Guice, how can I inject a bounded-wildcard class?但我不确定,因为我的测试没有通过。

import static java.util.Collections.*; 
import static org.junit.Assert.*; 
import java.util.Set; 
import org.junit.Test; 
import com.google.inject.*; 
import com.google.inject.multibindings.Multibinder; 

public class GuiceWildcardTest { 

    @Test public void binderShouldBindClassWithWildcard() { 
     Guice.createInjector(new AbstractModule() { 
      @Override protected void configure() { 
       bind(new TypeLiteral<Class<? extends SuperClass>>() {}).toInstance(SubClass.class); 
       ClassHolder holder = new ClassHolder(); 
       requestInjection(holder); 
       assertEquals(SubClass.class, holder.type); 
      } 
     }); 
    } 

    @Test public void multibinderShouldBindSetOfClassesWithWildcard() { 
     Guice.createInjector(new AbstractModule() { 
      @Override protected void configure() { 
       Multibinder.newSetBinder(binder(), new TypeLiteral<Class<? extends SuperClass>>() {}).addBinding().toInstance(SubClass.class); 
       SetHolder holder = new SetHolder(); 
       requestInjection(holder); 
       assertEquals(singleton(SubClass.class), holder.types); 
      } 
     }); 
    } 

    static class SuperClass {} 

    static class SubClass extends SuperClass {} 

    static class ClassHolder { 
     @Inject Class<? extends SuperClass> type; 
    } 

    static class SetHolder { 
     @Inject Set<Class<? extends SuperClass>> types; 
    } 
} 
+0

我不_think_你的意思'TypeLiteral <类<?扩展超类>>',而是'TypeLiteral <?扩展超类>'。 – 2012-07-31 21:19:12

+0

我不知道:我想要一组类,就像我的示例的SetHolder类中定义的那样。我不想要一组实例。 – 2012-07-31 21:50:12

+0

好的,我明白了。如果我完全等待注射器被创建,那没关系。但是,如果我'requestInjection(a)'我的对象并直接检查注入者,那么它会失败。 – 2012-08-01 10:08:52

回答

1

我的问题是,我没有等到喷油器是完整的。 requestInjection()伎俩,但Injector创建,所以不会立即调用requestInjection()后。

此代码:

import static java.util.Collections.*; 
import static org.junit.Assert.*; 

import java.util.Set; 

import org.junit.Test; 

import com.google.inject.AbstractModule; 
import com.google.inject.Guice; 
import com.google.inject.Inject; 
import com.google.inject.TypeLiteral; 
import com.google.inject.multibindings.Multibinder; 

public class GuiceWildcardTest { 

    @Test public void binderShouldBindClassWithWildcard() { 
     final ClassHolder holder = new ClassHolder(); 
     Guice.createInjector(new AbstractModule() { 
      @Override protected void configure() { 
       bind(new TypeLiteral<Class<? extends SuperClass>>() {}).toInstance(SubClass.class); 
       requestInjection(holder); 
      } 
     }); 
     assertEquals(SubClass.class, holder.type); 
    } 

    @Test public void multibinderShouldBindSetOfClassesWithWildcard() { 
     final SetHolder holder = new SetHolder(); 
     Guice.createInjector(new AbstractModule() { 
      @Override protected void configure() { 
       Multibinder.newSetBinder(binder(), new TypeLiteral<Class<? extends SuperClass>>() {}).addBinding().toInstance(SubClass.class); 
       requestInjection(holder); 
      } 
     }); 
     assertEquals(singleton(SubClass.class), holder.types); 
    } 

    static class SuperClass {} 

    static class SubClass extends SuperClass {} 

    static class ClassHolder { 
     @Inject Class<? extends SuperClass> type; 
    } 

    static class SetHolder { 
     @Inject Set<Class<? extends SuperClass>> types; 
    } 
}