Java 得到 泛型類型

對於Class而言T已經被擦拭爲Object,而真正的T參數被轉到使用T的方法 (或者變量聲明或者其它使用T的地方)裏面(若是沒有那就沒有存根),因此沒法反射到T的具體類別,也就沒法獲得T.class。而 getGenericSuperclass()是Generic繼承的特例,對於這種狀況子類會保存父類的Generic參數類型,返回一個 ParameterizedType,這時能夠獲取到父類的T.class了,這也正是子類肯定應該繼承什麼T的方法。java

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

輸出:this

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 :0spa


貼一個看到代碼code

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();
        }
    }
相關文章
相關標籤/搜索