2016-07-07 35 views
0

例如如何在Guice AbstractModule中使用@Provides方法绑定泛型?

public final class SomeModule<T> extends AbstractModule { 
    private final Class<T> clazz; 
    public SomeModule(Class<T> clazz) { 
    this.clazz = clazz; 
    } 

    @Provides 
    T getT(@ExternalAnnotation Any any) { 
    Any payload = asset.get().getPayload(); 
    return payload.<T>unpack(clazz); 
    } 
} 

这将导致一个错误:

T cannot be used as a key; It is not fully specified. 

既不使用也不TypeLiteral重点似乎是恰当的在这里,因为我想返回类型仍然是类型T.思想?

回答

2

对于类型擦除,Guice不会从模块的实例获取足够的信息来确定您绑定的是哪种类型。

相反,接受一个类的文字并使用它。这个例子保留了泛型,但如果你不需要它们,你可以放弃它们。

// Warning: Untested. Please revise if needed. 
public final class SomeModule<T> extends AbstractModule { 
    private Class<T> t; 

    public SomeModule(Class<T> t) { 
    this.t = t; 
    } 

    @Override 
    public void configure() { 
    // Uses a class instance rather than reflection, so this is fine. 
    bind(t).toProvider(new Provider<T>() { 
     // ... do stuff 
    }); 
    } 
} 

参见:

+0

感谢您的快速响应,并链接到其他的例子! –