您的位置:首页 > 编程语言 > Java开发

Java 获得 泛型类型

2016-07-15 15:58 411 查看
对于Class而言T已经被擦拭为Object,而真正的T参数被转到使用T的方法 (或者变量声明或者其它使用T的地方)里面(如果没有那就没有存根),所以无法反射到T的具体类别,也就无法得到T.class。而 getGenericSuperclass()是Generic继承的特例,对于这种情况子类会保存父类的Generic参数类型,返回一个 ParameterizedType,这时可以获取到父类的T.class了,这也正是子类确定应该继承什么T的方法。

public class param<T1, T2> {
class A {}
class B extends A {}

private Class<T1> entityClass;
protected param (){
Type type = getClass().getGenericSuperclass();
System.out.println("getClass()==" + getClass());
System.out.println("type = " + type);
Type trueType = ((ParameterizedType)type).getActualTypeArguments()[0];
System.out.println("trueType1 = " + trueType);
trueType = ((ParameterizedType)type).getActualTypeArguments()[1];
System.out.println("trueType2 = " + trueType);
this.entityClass = (Class<T1>)trueType;

B t = new B();
type = t.getClass().getGenericSuperclass();

System.out.println("B is A's super class :" + ((ParameterizedType)type).getActualTypeArguments().length);
}
}


public class subParam extends param<Myclass, Myinvoke> {
public static void main(String[] args) throws Exception{
subParam  s = new subParam();
}
}

输出:

getClass()==class com.example.test.subParam
type = com.example.test.param<com.example.test.Myclass, com.example.test.Myinvoke>
trueType1 = class com.example.test.Myclass
trueType2 = class com.example.test.Myinvoke
B is A's super class :0

贴一个看到代码

public class RawDao<T> {
protected Class<T> clazz;

@SuppressWarnings("unchecked")
public RawDao() {
@SuppressWarnings("rawtypes")
Class clazz = getClass();

while (clazz != Object.class) {
Type t = clazz.getGenericSuperclass();
if (t instanceof ParameterizedType) {
Type[] args = ((ParameterizedType) t).getActualTypeArguments();
if (args[0] instanceof Class) {
this.clazz = (Class<T>) args[0];
break;
}
}
clazz = clazz.getSuperclass();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: