java 自身类泛型获取
第一是泛化,可以拿个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项用法,在框架类里配合使用反射和泛型,使得框架的能力更强; 同时采用收敛特性,本着对人民负责的精神,用泛型使框架更加类型安全,更少强制类型转换。
关键代码
Class<T> entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
示例代码
public class Base<T>{ public void getSuperclassTypeParameter() { Type superclass = getClass().getGenericSuperclass(); if (superclass instanceof Class) { throw new RuntimeException("Missing type parameter."); } else { ParameterizedType parameterized = (ParameterizedType)superclass; Class<T> entityClass = (Class<T>) parameterized.getActualTypeArguments()[0]; System.out.println(entityClass); } } public static void main(String args[]) { Base<AuthenticatorUser> base= new Base<AuthenticatorUser>(){}; base.getSuperclassTypeParameter(); } }
输出结果:class superclass.AuthenticatorUser
注意:
创建对象一定要加{}
Base<AuthenticatorUser> base= new Base<AuthenticatorUser>(){};
如果不加就取不到
Base<AuthenticatorUser> base= new Base<AuthenticatorUser>();

浙公网安备 33010602011771号