背景
我对Java泛型的理解是,它完全是编译时特性(主要关注类型安全检查)。任何泛型类的类型信息在运行时丢失(类型擦除)。
尽管如此,我仍然看到许多框架()似乎也可以在运行时利用类型信息。例如,google 提供者。guice提供程序可以在运行时实例化并提供其泛型类型的新实例。
class Container
{
@Inject
public Container(Provider<Content> contentProvider)
{
//This works at Runtime... but How ???
//When type's are not even preserved at runtime, how does the Provider knows it has to instantiate an object of type 'Content'
Content content = contentProvider.get();
}
}问题
发布于 2017-08-21 17:59:25
是否有任何与运行时保存的泛型类型有关的信息。?如果是,什么?
保存在编译类中的单个信息是从擦除后得到的原始对象/变量到源代码中用作泛型的特定类型的转换。
但是它们仅仅依赖于声明的变量类型,而不是真正使用的泛型类型。
因此,在运行时,在实例化泛型类时,如果不传递类,则无法直接访问泛型信息。
如果不是,那么像google这样的库是如何在内部运行的(
你错了。
在Guice中,这个代码:
Content content = contentProvider.get(); 将返回Content的实例,而不是泛型类型。看看文档:
T get() 提供T的一个实例。
https://stackoverflow.com/questions/45802927
复制相似问题