guice的TypeLiteral如何工作?

时间:2010-07-30 10:32:33

标签: java generics guice

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

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

2 个答案:

答案 0 :(得分:29)

这里使用的技巧是泛型超类型的签名存储在子类中,因此存活擦除。

如果您创建匿名子类new TypeLiteral<List<String>>() {},Guice可以在其上调用getClass().getGenericSuperclass()并获得java.lang.reflect.ParameterizedType,其中存在方法getActualTypeArguments()以获取List<String> ParameterizedType的实例。

答案 1 :(得分:8)

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

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

在Java中,泛型声明保留在Class和Method声明中,所以如果我写这个。

public abstract class Class1<T>
{
}

public class Class2 extends Class1<Integer>
{
}

我实际上可以在Class1中编写代码,如果Class2是子类,它可以判断出它自己的泛型类型是Integer。

查看java.lang.Class API以获取相应的方法(名称中包含Generic)。