Java獲取一個類繼承的父類或者實現的接口的泛型參數

泛型的作用就不多介紹了,如果你想具備架構設計能力,那麼熟練使用泛型是必不可少的。

不多說了,先定義泛型父類和泛型接口:

package cn.zhh;

public class Parent<T1, T2> {
}
package cn.zhh;

public interface Interface<T> {
}

然後,定義一個子類,分別繼承和實現以上的父類以及接口:(記得泛型參數寫在父類或者接口那裏,否則視爲該類聲明泛型參數

package cn.zhh;

public class Son extends Parent<Integer, Long> implements Interface<String>, Cloneable {
}

接着,分別獲取父類和接口的泛型參數:

package cn.zhh;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Arrays;

/**
 * 測試
 *
 * @author Zhou Huanghua
 */
public class Test {

    public static void main(String[] args) {
        Class<Son> clazz = Son.class;
        // 接口泛型類
        Type[] genericInterfaces = clazz.getGenericInterfaces();
        Arrays.stream(genericInterfaces).forEach(System.out::println);
        Type genericInterface = genericInterfaces[0];
        System.out.println(genericInterface.getTypeName());
        if (genericInterface instanceof ParameterizedType) {
            print((ParameterizedType) genericInterface);
        }
        System.out.println("\n----------------------------------------");
        // 父類泛型類
        Type genericSuperclass = clazz.getGenericSuperclass();
        System.out.println(genericSuperclass.getTypeName());
        if (genericSuperclass instanceof ParameterizedType) {
            print((ParameterizedType) genericSuperclass);
        }
    }

    private static void print(ParameterizedType parameterizedType) {
        System.out.println(parameterizedType.getOwnerType());
        System.out.println(parameterizedType.getRawType());
        System.out.print("泛型參數:");
        Arrays.stream(parameterizedType.getActualTypeArguments()).forEach(arg -> System.out.print(arg + "、"));
    }
}

最後,驗證一下結果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章