獲取泛型的實際類型

package com.example.net;

import androidx.lifecycle.Observer;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;

public class TestType {

    /**
     * 獲取泛型的實際類型
     *
     * @param object 如 Result<T>
     * @return Type
     */
    public static Type getType(Object object) {
        Type type = null;
        try {
            Type[] interfaceTypes = object.getClass().getGenericInterfaces();
            if (interfaceTypes.length == 0) {
                //非接口
                type = object.getClass().getGenericSuperclass();
            } else {
                //接口
                type = interfaceTypes[0];
            }
            if (type != null) {
                if (ParameterizedType.class.isAssignableFrom(type.getClass())) {
                    type = (((ParameterizedType) type).getActualTypeArguments())[0];
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return type;
    }

    public static void main(String[] args) {
        NetRequest netRequest = new NetRequest();
        netRequest.observer = new Observer<NetResult<List<NetWeather>>>() {
            @Override
            public void onChanged(NetResult<List<NetWeather>> netResult) {

            }
        };
        netRequest.netCallback = new NetCallback<NetResult<List<NetWeather>>>() {
            @Override
            public void callback(NetResult<List<NetWeather>> netResult) {

            }
        };
        NetCallback2 netCallback2 = new NetCallback2() {
            @Override
            public void callback() {

            }
        };
        List<List<String>> list1 = new ArrayList<List<String>>();
        List<List<String>> list2 = new ArrayList<List<String>>() {
        };
        System.out.println("getType : " + getType(list1));
        System.out.println("getType : " + getType(list2));
        System.out.println("getType : " + getType(netRequest.observer));
        System.out.println("getType : " + getType(netRequest));
        System.out.println("getType : " + getType(netCallback2));
        System.out.println("getType : " + String.class.getCanonicalName());
        System.out.println("getType : " + getType(new Object()));
    }

}

getType : E
getType : java.util.List<java.lang.String>
getType : com.example.net.NetResult<java.util.List<com.example.net.NetWeather>>
getType : class java.lang.Object
getType : interface com.example.net.NetCallback2
getType : java.lang.String
getType : null
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容