Java類型中ParameterizedType,GenericArrayType,TypeVariabl,WildcardType詳解


和反射+泛型有關的接口類型

  • java.lang.reflect.Type:java語言中所有類型的公共父接口
  • java.lang.reflect.ParameterizedType
  • java.lang.reflect.GenericArrayType
  • java.lang.reflect.WildcardType
  • java.lang.reflect.TypeVariable

1. Type直接子接口

ParameterizedType,GenericArrayType,TypeVariable和WildcardType四種類型的接口

  • ParameterizedType: 表示一種參數化的類型,比如Collection
  • GenericArrayType: 表示一種元素類型是參數化類型或者類型變量的數組類型
  • TypeVariable: 是各種類型變量的公共父接口
  • WildcardType: 代表一種通配符類型表達式,比如?, ? extends Number, ? super Integer【wildcard是一個單詞:就是“通配符”】

2. Type直接實現子類 :Class類

3. java.lang.reflect.Type接口

Type所有類型指代的有:原始類型 (raw types)【對應Class】,參數化類型 (parameterizedtypes)【對應ParameterizedType】, 數組類型 (array types)【對應GenericArrayType】,類型變量 (type variables)【對應TypeVariable】,基本數據類型(primitivetypes)【仍然對應Class】

4. java.lang.reflect.ParameterizedType接口

ParameterizedType接口類型的含義: 表示參數化類型。比如:Map這種參數化類型

獲取參數化類型<>中的實際類型  ===》源碼聲明:Type[] getActualTypeArguments();

【注意】無論<>中有幾層<>嵌套,這個方法僅僅脫去最外層的<>之后剩下的內容就作為這個方法的返回值。 

例子如下:

public class TestController {
public static void main(String[] args) throws Exception {
TestController testController = new TestController(); //獲取當前類
Method testParam = testController.getClass().getMethod("testParam", ArrayList.class, ArrayList.class, ArrayList.class, ArrayList.class, ArrayList.class); //獲取下面的方法
Type[] genericParameterTypes = testParam.getGenericParameterTypes(); //獲取方法泛型類參數
for (Type genericParameterType : genericParameterTypes) {
if (genericParameterType instanceof ParameterizedType) {
ParameterizedType parameterizedType = (ParameterizedType) genericParameterType; //強轉為泛型類
Type[] actualTypeArguments = parameterizedType.getActualTypeArguments(); //獲取泛型真實聲明的類型,調用一次只會去掉最外層的一個<>
for (Type actualTypeArgument : actualTypeArguments) {
System.out.println(actualTypeArgument.getTypeName()); //打印真實類型
}
}
}
}

public <E> E testParam(ArrayList<ArrayList<Integer>> al1,
ArrayList<E> al2,
ArrayList<String> al3,
ArrayList<? extends Number> al4,
ArrayList<E[]> al5){

Type genericSuperclass = this.getClass().getGenericSuperclass();
Class<?> superclass1 = this.getClass().getSuperclass();
Type genericSuperclass1 = al1.getClass().getGenericSuperclass();
Class<?> superclass = al1.getClass().getSuperclass();
Type aClass = al1.getClass();

if (aClass instanceof ParameterizedType) {
ParameterizedType p1 = (ParameterizedType) aClass;
}
return al2.get(0);
}
}
 

打印如下:

java.util.ArrayList<java.lang.Integer>  // 由此可見只脫去了一層<>
E
java.lang.String
? extends java.lang.Number
E[]

如上方法,那么它的每一參數總體上看都是參數化類型的。

5、 java.lang.reflect. GenericArrayType接口

 GenericArrayType接口類型的含義:表示泛型數組類型。比如:void method(E[] al){…} 其中的E[] 就是該接口類型

獲取泛型數組中元素的類型===》 源碼聲明:Type getGenericComponentType();

 【注意】無論從左向右有幾個[]並列,這個方法僅僅脫去最右邊的[]之后剩下的內容就作為這個方法的返回值。

例子如下:

import java.lang.reflect.GenericArrayType;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.lang.reflect.Type;
import java.util.ArrayList;

/**
 * @author Green
 * @date 2021年12月31日 2:31 下午
 */
public class Test {

    public static void main(String[] args) throws Exception {
        Test test = new Test();
        Method methodV = test.getClass().getMethod("methodV",String.class, String[].class, Object[].class, ArrayList[].class, Object[][].class);
        Parameter[] parameters = methodV.getParameters();
        for (Parameter parameter : parameters) {
            Type parameterizedType = parameter.getParameterizedType();  //獲取參數類型
            if (GenericArrayType.class.isInstance(parameterizedType)) {   // 參數3、4是泛型數組,會走這里
                Type genericComponentType = ((GenericArrayType) parameterizedType).getGenericComponentType();
                System.out.println(genericComponentType.getTypeName());
            }
            if (Class.class.isInstance(parameterizedType)) {   // 參數1、2、4會走這里,是Class類型
                System.out.println(((Class) parameterizedType).getTypeName());
            }
        }
    }

    public  <E>  E methodV(
            String p11,
            String[] p1,
            E[] p2,
            ArrayList[] p3,
            E[][] p4){
        return p2[0];
    }

}

 

 打印如下:

java.lang.String
java.lang.String[]
E
java.util.ArrayList[]
E[]

 

6、java.lang.reflect.TypeVariable接口

 TypeVariable接口類型的含義: 表示泛型類型參數或者又叫做類型變量。比如:void method(E e){}中的E就是該接口類型

(這里經過驗證,發現后面的內容轉載說的不對,所以沒有復制進來,看這篇:https://www.cnblogs.com/cainiao-Shun666/p/15754113.html 轉載博客會說明該接口用法)

7、java.lang.reflect.WildcardType接口

WildcardType接口類型的含義 :表示通配符類型的表達式

這個接口說明也參考看下一篇轉載博客;

 

轉載:https://blog.csdn.net/smart_snail/article/details/69295224

看這篇轉載博客更清晰:https://www.cnblogs.com/cainiao-Shun666/p/15754113.html

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM