泛型的作用就不多介紹了,如果你想具備架構設計能力,那麼熟練使用泛型是必不可少的。
不多說了,先定義泛型父類和泛型接口:
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 + "、"));
}
}
最後,驗證一下結果: