首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >guice的TypeLiteral是如何工作的?

guice的TypeLiteral是如何工作的?
EN

Stack Overflow用户
提问于 2010-07-30 18:32:33
回答 2查看 3.5K关注 0票数 27

Guice的TypeLiteral如何克服Java泛型类型擦除过程?

它创造了奇迹,但这是如何实现的呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-07-30 19:40:08

这里使用的诀窍是泛型超类型的签名存储在子类中,因此不会被擦除。

如果你创建了一个匿名子类new TypeLiteral<List<String>>() {},Guice可以在它上面调用getClass().getGenericSuperclass()并获取一个java.lang.reflect.ParameterizedType,在这个子类上存在一个方法getActualTypeArguments()来获取List<String>作为ParameterizedType的一个实例。

票数 29
EN

Stack Overflow用户

发布于 2010-07-30 19:42:05

通过组合匿名类型、子类化以及Java不会完全擦除所有泛型声明这一事实。

如果你仔细观察,你会发现TypeLiteral有一个受保护的构造函数,所以你在构造一个新的构造函数时使用了一个额外的{},它创建了一个匿名子类TypeLiteral。

在Java中,泛型声明保留在类和方法声明中,所以如果我这样写的话。

代码语言:javascript
复制
public abstract class Class1<T>
{
}

public class Class2 extends Class1<Integer>
{
}

实际上,我可以用Class1编写代码,如果Class2是子类,那么它自己的泛型类型就是整型。

查看java.lang.Class应用程序接口以获得适当的方法(它们的名称中有泛型)。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3370641

复制
相关文章

相似问题

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