反射和泛型(三)
补充,还有两种获取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

浙公网安备 33010602011771号