mga*_*mer 27 java generics guice
Guice的TypeLiteral如何克服Java泛型类型擦除过程?
它创造了奇迹,但这是如何实现的?
Mor*_*itz 29
这里使用的技巧是泛型超类型的签名存储在子类中,因此可以在擦除后继续存在.
如果你创建一个匿名子类,new TypeLiteral<List<String>>() {}Guice可以调用getClass().getGenericSuperclass()它并获得一个java.lang.reflect.ParameterizedType存在方法getActualTypeArguments()来获取List<String>的实例ParameterizedType.
通过匿名类型的组合,子类化以及Java不会完全擦除所有泛型声明的事实.
如果仔细观察,TypeLiteral会有一个受保护的构造函数,因此在构造一个创建TypeLiteral的匿名子类的新构造函数时会使用额外的{}.
在Java中,泛型声明保留在Class和Method声明中,所以如果我写这个.
public abstract class Class1<T>
{
}
public class Class2 extends Class1<Integer>
{
}
Run Code Online (Sandbox Code Playgroud)
我实际上可以在Class1中编写代码,如果Class2是子类,它可以判断出它自己的泛型类型是Integer.
查看java.lang.Class API以获取相应的方法(名称中包含Generic).
| 归档时间: |
|
| 查看次数: |
3361 次 |
| 最近记录: |