Guice的TypeLiteral如何克服Java泛型类型擦除过程?
它创造了奇迹,但这是如何实现的呢?
发布于 2010-07-30 19:40:08
这里使用的诀窍是泛型超类型的签名存储在子类中,因此不会被擦除。
如果你创建了一个匿名子类new TypeLiteral<List<String>>() {},Guice可以在它上面调用getClass().getGenericSuperclass()并获取一个java.lang.reflect.ParameterizedType,在这个子类上存在一个方法getActualTypeArguments()来获取List<String>作为ParameterizedType的一个实例。
发布于 2010-07-30 19:42:05
通过组合匿名类型、子类化以及Java不会完全擦除所有泛型声明这一事实。
如果你仔细观察,你会发现TypeLiteral有一个受保护的构造函数,所以你在构造一个新的构造函数时使用了一个额外的{},它创建了一个匿名子类TypeLiteral。
在Java中,泛型声明保留在类和方法声明中,所以如果我这样写的话。
public abstract class Class1<T>
{
}
public class Class2 extends Class1<Integer>
{
}实际上,我可以用Class1编写代码,如果Class2是子类,那么它自己的泛型类型就是整型。
查看java.lang.Class应用程序接口以获得适当的方法(它们的名称中有泛型)。
https://stackoverflow.com/questions/3370641
复制相似问题