zoukankan      html  css  js  c++  java
  • 利用ParameterizedType获取泛型参数类型


    //利用ParameterizedType获取java泛型的参数类型

    public class Demo {
        public static void main(String[] args) {
            classTest();
            interfaceTest();
        }
        private static void classTest() {
            MySuperClass<Student, String> mySuperClass = new MySuperClass<Student, String>() {
                @Override
                public void onSuccess(Student data) {
                }
            };
            //getClass().getGenericSuperclass()返回表示此 Class 所表示的实体的直接超类的 Type
            ParameterizedType type = (ParameterizedType) mySuperClass.getClass().getGenericSuperclass();
            sysoType(type);
        }
        private static void interfaceTest() {
            MyInterface<Student, String> myInterface = new MyInterface<Student, String>() {
                @Override
                public void onSuccess(Student data) {
                }
            };
            ParameterizedType type = (ParameterizedType) myInterface.getClass().getGenericInterfaces()[0];
            sysoType(type);
        }
        private static void sysoType(ParameterizedType type) {
            /*com.bqt.generic.MySuperClass<com.bqt.generic.Student, java.lang.String>
            class sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
            class com.bqt.generic.Student
            class java.lang.Class
            class java.lang.String
            class java.lang.Class
            
            com.bqt.generic.MyInterface<com.bqt.generic.Student, java.lang.String>
            class sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
            class com.bqt.generic.Student
            class java.lang.Class
            class java.lang.String
            class java.lang.Class*/
            System.out.println(type + " " + type.getClass());
            //返回表示此类型实际类型参数的 Type 对象的数组,泛型的参数可能有多个,我们需要哪个就取哪个
            Type[] targets = type.getActualTypeArguments();
            for (int i = 0; i < targets.length; i++) {
                System.out.println(targets[i] + " " + targets[i].getClass());
            }
        }
    }

    public abstract class MySuperClass<T,V> {

        public abstract void onSuccess(T data);
    }
    public interface MyInterface<T,V> {
        void onSuccess(T data);
    }

    public class Student {

    }





  • 相关阅读:
    洛谷 P1284 三角形牧场WD
    luogu P3817 小A的糖果
    P3374 【模板】树状数组 1
    线程与threading模块
    socketserver模块
    python 粘包问题及解决方法
    python 网络编程
    类的进阶四 反射和内置方法
    python hashlib模块 logging模块 subprocess模块
    类的进阶三
  • 原文地址:https://www.cnblogs.com/baiqiantao/p/5373283.html
Copyright © 2011-2022 走看看