我想使用Guice类型文字内置注入,因为我需要注入类信息。请参阅以下示例:
public class Foo<T> {
private Class<T> clazz;
@Inject
public Foo(TypeLiteral<T> literal) {
this.clazz = literal.getRawType();
}
}
它会完美运行,但getRawType()
方法会返回Class<? super T>
。内部clazz
变量被用作另一个类的方法的参数。
如果我将clazz
类型修改为Class<? super T>
,我将不得不重做一堆类。
这里最优雅的解决方案是什么?
答案 0 :(得分:1)
在这种情况下,您可以将原始类型转换为Class<T>
,但最终可能会将其取消选中,如下所示:
@Inject
public Foo(TypeLiteral<T> literal) {
this.clazz = (Class<T>) literal.getRawType();
}
为了回答你的问题,为什么会这样做,Why does Guava's TypeToken<T>.getRawType() return Class<? super T> instead of Class<T>有类似的答案。这是一个很好的例子作为答案。