E.g。
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和Key似乎都不合适,因为我希望返回类型仍然是T类型。思想?
答案 0 :(得分: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
});
}
}
另见: