反射和泛型(三)

补充,还有两种获取type接口的方式:

一.子类继承一个泛型的父类;

二.子类继承一个泛型接口

实例代码如下:

先定义一个泛型接口:

public interface MyComparatorInterface<T> {

    int compare(T a,T b);
}

再定义两个实现该泛型接口的类:

public class MyComparator implements MyComparatorInterface<Integer>{

    @Override
    public int compare(Integer a, Integer b) {
        return (a-b);
    }
}

public class MyComparator2 implements MyComparatorInterface<Double> {
@Override
public int compare(Double a, Double b) {
return (a>=b)?1:0;
}
}
 

编写util类,动态地获取MyComparatorInterface实例的具体泛型信息:

public static void getGennericType(Object obj) throws NoSuchMethodException {

        final Class<?> clazz = obj.getClass();
        final Type[] genericSuperclass = clazz.getGenericInterfaces();
        //由于泛型参数只有一个,所以只需要打印出第一个即可
        System.out.println("print type:"+genericSuperclass[0]);
        if(genericSuperclass[0] instanceof ParameterizedType){
            final Type[] actualTypeArguments = ((ParameterizedType) genericSuperclass[0]).getActualTypeArguments();
            //由于泛型参数只有一个,所以只需要打印出第一个即可
            System.out.println("print actualtypearguments"+actualTypeArguments[0]);
        }
    }

进行测试并打印:

public static void main(String[] args) throws NoSuchMethodException {

        MyComparatorInterface comparator = new MyComparator();
        getGennericType(comparator);

        MyComparatorInterface comparator2 = new MyComparator2();
        getGennericType(comparator2);
    }

结果如下:

print type: generic.MyComparatorInterface<java.lang.Integer>
print actualtypearguments: class java.lang.Integer
print type: generic.MyComparatorInterface<java.lang.Double>
print actualtypearguments: class java.lang.Double

posted @ 2020-02-19 16:47  盛夏群岛  阅读(122)  评论(0)    收藏  举报