您的位置:首页 > 其它

如何获取继承类中的泛型T的类型

2015-02-27 17:30 387 查看
首先, T.getClass() 或 T.class都是非法的,因为T是泛型变量;

由于一个类的类型在编译期已确定,故不能在运行期得到T的实际类型;

获取方式如下:
abstract class A<T> {
public Class<T> getGenericType() {
Class<T> clz = (Class<T>) (((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0]);
return clz;
}
}


上面的代码不是万能的,只有实例化T的子类才能按上述方法获得T的实际类型,

如果子类没有实例化T,则无法获取T的实际类型;

比如,class B 并没有实例化T,所以得不到String.class;

代码如下:
class B<T> extends A<T> {
public static void main(String[] args) {
B<String> b = new B<String>();
System.out.println(b.getGenericType());
}
}


正确的代码如下:
class C extends A<String> {
public static void main(String[] args) {
C c = new C();
System.out.println(c.getGenericType());
}
}

class C按如上方式声明,则可以得到String.class;

以上转载(有所修改)自 http://bbs.chinaunix.net/thread-3677562-1-1.html
对于获取泛型的方法,比较完整的代码如下,

class BaseDaoImpl<T> implements IBaseDao<T> {
public BaseDaoImpl() {
Class<T> clz = (Class<T>) getSuperClassGenricType(this.getClass());
System.out.println(clz);
}

/**
* 通过反射,获得定义Class时声明的父类的泛型参数的类型. 如无法找到,返回Object.class
*/
public static Class<Object> getSuperClassGenricType(final Class clz) {
Type type = clz.getGenericSuperclass();
if(!(type instanceof ParameterizedType)) {
return Object.class;
}
Type[] params = ((ParameterizedType)type).getActualTypeArguments();
if(!(params[0] instanceof Class)) {
return Object.class;
}
return (Class) params[0];
}
}

以上代码参考:http://blog.csdn.net/running_snail_/article/details/7077947

另外,badqiu的脚手架项目代码中,有另外一种方式,父类本身不获取泛型的具体类型,

仅提供抽象方法,由子类来提供具体的类型;

public abstract class A<T> {
public abstract Class getEntityClass();
}

public class B extends A<String> {
public Class getEntityClass() {
return String.class;
}
}


另外,请参考 http://developer.51cto.com/art/201103/250028.htm
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  泛型 类型