泛型类里面获取到泛型的类型

ava泛型泛型类
下面的代码可以让你在抽象的泛型类里面获取到泛型的类型 

Java代码

abstract class A<T> {   
    Class<T> clazz;   
    void doGetClass() {   
        Type genType = this.getClass().getGenericSuperclass();   
        Type[] params = ((ParameterizedType) genType).getActualTypeArguments();   
        this.clazz = (Class<T>) params[0];   
    }   
}  

abstract class A<T> {
    Class<T> clazz;
    void doGetClass() {
        Type genType = this.getClass().getGenericSuperclass();
        Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
        this.clazz = (Class<T>) params[0];
    }
}

1,当然上面的代码不是万能的,只有实例化了T的子类才可以按上述方法获得T,如果子类没有实例化T的话,是无法获取的。 
比如有: 
Java代码

<span style="color:#ff0000;">//class B并没有实例化T。 </span>  
 class B<T> extends A<T>{   
   ...   
  }  

<span style="color:#ff0000;">//class B并没有实例化T。</span>
 class B<T> extends A<T>{
   ...
  }

由于class B并没有实例化T,所有下面的代码拿不到String.class: 
Java代码

B<String> b = new B<String>();   
b.doGetClass();<span style="color:#ff0000;">//拿不到String  </span>

B<String> b = new B<String>();
b.doGetClass();<span style="color:#ff0000;">//拿不到String</span>
2,正确的做法: 
Java代码

class B extends A<String>{   
}  

class B extends A<String>{
}

B按上面方式声明,下面代码可以拿到String.class: 
Java代码

B b = new B();   
b.doGetClass();// b.clazz is String.class  

B b = new B();
b.doGetClass();// b.clazz is String.class
/**
     * 通过反射, 获得定义Class时声明的父类的泛型参数的类型. 如无法找到, 返回Object.class.
     * 
     *@param clazz
     *            clazz The class to introspect
     * @param index
     *            the Index of the generic ddeclaration,start from 0.
     * @return the index generic declaration, or Object.class if cannot be
     *         determined
     */
    @SuppressWarnings("unchecked")
    public static Class<Object> getSuperClassGenricType(final Class clazz, final int index) {
    	
    	//返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的 Type。
        Type genType = clazz.getGenericSuperclass();

        if (!(genType instanceof ParameterizedType)) {
           return Object.class;
        }
        //返回表示此类型实际类型参数的 Type 对象的数组。
        Type[] params = ((ParameterizedType) genType).getActualTypeArguments();

        if (index >= params.length || index < 0) {
                     return Object.class;
        }
        if (!(params[index] instanceof Class)) {
              return Object.class;
        }

        return (Class) params[index];
    }

文章转载出自: 点击打开链接
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值