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>();

 

posted @ 2017-09-27 18:29  BlueBerry006  Views(2481)  Comments(0)    收藏  举报