美文网首页
获取泛型的实际类型

获取泛型的实际类型

作者: 木木禾木 | 来源:发表于2021-03-18 15:58 被阅读0次
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

相关文章

  • 获取泛型的实际类型

  • Java反射相关

    //获取超类的泛型参数的实际类型Class c = this.getClass();//获取当前类类型//P...

  • 获取泛型实现类的泛型实际类型

    当我们写一些通用的框架的时候,比较有用 //通过子类获取父类的通用类型 Type superclass = thi...

  • 参数化泛型getGenericSuperclass

    问题:如何获取泛型参数的实际类型?也就是class对象? 泛型参数因为泛型的不确定性,我们在写代码的时候,无法直接...

  • Java 完美获取泛型类型(包含嵌套的泛型)

    完美获取泛型类型(包含嵌套多层的泛型) 1. 工具类 获取泛型类型工具类 2. 使用方法 2.1. 集成接口带有泛...

  • 大连滕泰科技学习笔记2020-07-10

    1,项目组6复习内容 1,1 泛型泛型定义:泛指任意类型,实际是对类型的限制。泛型类泛型接口泛型方法泛型继承-- ...

  • Java如何在运行时获取泛型的类型

    Java泛型是伪泛型,会在编译完成时进行类型的擦除,我们无法在运行时获取泛型参数的具体类型(类型擦除会被替换成泛型...

  • Java泛型的原始类型

    众所周知,Java中的泛型在编译期被擦除,那有没有办法在运行时获取到泛型的原始类型呢?有的。 获取泛型类型 如果定...

  • Java之泛型

    泛型泛型就是指参数化类型,用符号标记是实际类型的占位符,是从JDK1.5出现的新特性。泛型可分为:泛型类泛型方法泛...

  • 通过反射获取泛型

    获取泛型参数的信息:1、通过Field.getGenericType()方法获取到Type类型(该对象中包含了泛型...

网友评论

      本文标题:获取泛型的实际类型

      本文链接:https://www.haomeiwen.com/subject/bmqpcltx.html