首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java :在运行时是否也保存了关于泛型类型的任何元信息?

Java :在运行时是否也保存了关于泛型类型的任何元信息?
EN

Stack Overflow用户
提问于 2017-08-21 17:45:41
回答 6查看 1.4K关注 0票数 4

背景

我对Java泛型的理解是,它完全是编译时特性(主要关注类型安全检查)。任何泛型类的类型信息在运行时丢失(类型擦除)。

尽管如此,我仍然看到许多框架()似乎也可以在运行时利用类型信息。例如,google 提供者。guice提供程序可以在运行时实例化并提供其泛型类型的新实例。

代码语言:javascript
复制
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();   
     }
}

问题

  1. 是否有任何与运行时保存的泛型类型有关的信息。如果是,什么?If no,而不是像google这样的库是如何在内部运行的(上面的例子)
  2. 泛型不仅仅是编译时的安全性吗?与之一样,是否有任何用例(除了确保编译时的安全),在使用泛型时可以获得优势?
EN

Stack Overflow用户

发布于 2017-08-21 17:59:25

是否有任何与运行时保存的泛型类型有关的信息。?如果是,什么?

保存在编译类中的单个信息是从擦除后得到的原始对象/变量到源代码中用作泛型的特定类型的转换。

但是它们仅仅依赖于声明的变量类型,而不是真正使用的泛型类型。

因此,在运行时,在实例化泛型类时,如果不传递类,则无法直接访问泛型信息。

如果不是,那么像google这样的库是如何在内部运行的(

你错了。

在Guice中,这个代码:

代码语言:javascript
复制
 Content content = contentProvider.get();   

将返回Content的实例,而不是泛型类型。看看文档

T get() 提供T的一个实例。

票数 0
EN
查看全部 6 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45802927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档