第一是泛化,可以拿个T代表任意类型。 但GP是被C++严苛的静态性逼出来的,落到Java、C#这样的花语平原里----所有对象除几个原始类型外都派生于Object,再加上Java的反射功能,Java的Collection库没有范型一样过得好好的。
第二是泛型 + 反射,原本因为Java的泛型拿不到T.class而觉得泛型没用,最近才刚刚学到通过反射的API来获取T的Class,后述。
第三是收敛,就是增加了类型安全,减少了强制类型转换的代码。这点倒是Java Collection历来的弱项。
第四是可以在编译期搞很多东西,比如MetaProgramming。但除非能完全封闭于框架内部,框架的使用者和扩展者都不用学习这些东西的用法,否则那就是自绝于人民的票房毒药。C++的MetaProgramming好厉害吧,但对比一下Python拿Meta Programming生造一个Class出来的简便语法,就明白什么才是真正的叫好又叫座。
所以,作为一个架构设计师,应该使用上述的第2,3项用法,在框架类里配合使用反射和泛型,使得框架的能力更强; 同时采用收敛特性,本着对人民负责的精神,用泛型使框架更加类型安全,更少强制类型转换。
关键代码
ClassentityClass =(Class) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
示例代码
public class Base{public voidgetSuperclassTypeParameter() {
Type superclass=getClass().getGenericSuperclass();if(superclass instanceof Class) {throw new RuntimeException("Missing type parameter.");
}else{
ParameterizedType parameterized=(ParameterizedType)superclass;
Class entityClass = (Class) parameterized.getActualTypeArguments()[0];
System.out.println(entityClass);
}
}public static voidmain(String args[]) {
Base base= new Base(){};base.getSuperclassTypeParameter();
}
}
输出结果:class superclass.AuthenticatorUser
注意:
创建对象一定要加{}
Base base= new Base(){};
如果不加就取不到
Base base= new Base();