大家都知道Java源码在编译之后会擦除泛型信息,现在来看一个泛型未被擦除的情况,见ConcurrentHashMap.comparableClassFor方法。
ParameterizedType.getActualTypeArguments能获取类所实现的接口中未被擦除的泛型信息。实验如下:
public class Parameterized { public static void main(String[] args) { Type[] types = Integer.class.getGenericInterfaces(); // Type[] types = HashMap.class.getGenericInterfaces(); for (Type type: types) { System.out.println(type); if (type instanceof ParameterizedType) { ParameterizedType p = (ParameterizedType) type; System.out.println(" -RawType: " + p.getRawType()); System.out.println(" -OwnerType: " + p.getOwnerType()); Type[] typeArgs = p.getActualTypeArguments(); System.out.println(" -ActualTypeArguments:" + Arrays.toString(typeArgs)); } } } }
输出:
Integer.class
java.lang.Comparable<java.lang.Integer> -RawType: interface java.lang.Comparable -OwnerType: null -ActualTypeArguments:[class java.lang.Integer]
HashMap.class
java.util.Map<K, V> -RawType: interface java.util.Map -OwnerType: null -ActualTypeArguments:[K, V] interface java.lang.Cloneable interface java.io.Serializable