ava泛型泛型类
下面的代码可以让你在抽象的泛型类里面获取到泛型的类型
1,当然上面的代码不是万能的,只有实例化了T的子类才可以按上述方法获得T,如果子类没有实例化T的话,是无法获取的。
比如有:
Java代码
由于class B并没有实例化T,所有下面的代码拿不到String.class:
Java代码
Java代码
B按上面方式声明,下面代码可以拿到String.class:
Java代码
文章转载出自: 点击打开链接
下面的代码可以让你在抽象的泛型类里面获取到泛型的类型
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];
}
文章转载出自: 点击打开链接