Type类型概念
Type是Java 编程语言中所有类型的公共高级接口。
在JDK1.5之前,所有的原始类型都通过字节码文件类Class进行抽象。Class类的一个具体对象就代表一个指定的原始类型。
JDK1.5加入了泛型类,扩充了数据类型,从只有原始类型基础上扩充了 参数化类型、类型变量类型、通配符类型、泛型数组类型。
Type是Java语言中所有类型(Class)的公共父接口。
Type类关系图
Type体系中类型的包括:Class(原始/基本类型),GenericArrayType(泛型数组类型),ParameterizedType(参数化类型),WildcardType(通配符类型),TypeVariable(类型变量)。
GenericArrayType 泛型数组类型
描述的是形如:A[](参数化类型数组)或者T[](类型变量数组)。
它的组成元素是ParameterizedType或TypeVariable类型。
注意:无论从左向右右几个[]并列,这个方法仅仅脱去最右边的[]之后剩下的内容就作为这个方法的返回值。
public interface GenericArrayType extends Type {
//返回泛型数组中成员类型,如:List<String>[],返回List<String>
@NonNull
Type getGenericComponentType();
}
ParameterizedType 参数化类型
public interface ParameterizedType extends Type {
//获取类型内部的参数化类型,比如Map<String,Pair> 返回的是String和Pair数组。注意改方法只返回最外层的<>中的类型,无论该<>内又多少个<>。
@NonNull
Type[] getActualTypeArguments();
//类的原始类型,一般都是class。如Map<String,Pair> 返回的是Map.class
@NonNull
Type getRawType();
//获取所有者类型(只有内部类才有所有者,如Map.Entry的所有者是Map)。如果不是内部类返回null。
@RecentlyNullable
Type getOwnerType();
}
WildCardType 通配符类型
通配符类型,比如<?>,<? extends Number>等。
如果没有指定上边界,则默认Object,如果没有指定下边界,则默认为String。
public interface WildcardType extends Type {
//获取泛型表达式上边界。如<T extends String> ,返回String.class
@NonNull
Type[] getUpperBounds();
//获取泛型表达式下边界。如<? Supper OutInputSream> ,OutInputSream.class
@NonNull
Type[] getLowerBounds();
}
TypeVariable 类型变量
public interface TypeVariable<D extends GenericDeclaration> extends Type, AnnotatedElement {
//获得泛型的上限,若未明确声明上边界则默认为Object
Type[] getBounds();
//获取声明该类型变量实体(即获得类、方法或构造器名),如返回实现类的类名
D getGenericDeclaration();
//获得名称,即K、V、E之类名称
String getName();
//获取注解类型的上限数组
AnnotatedType[] getAnnotatedBounds();
}
//事例代码:
public class Test <K extends Comparable & Serializable, V> {
K key;
V value;
public static void main(String[] args) throws Exception {
// 获取字段的类型
Field fk = TestType.class.getDeclaredField("key");
Field fv = TestType.class.getDeclaredField("value");
TypeVariable keyType = (TypeVariable)fk.getGenericType();
TypeVariable valueType = (TypeVariable)fv.getGenericType();
// getName 方法
System.out.println(keyType.getName()); // K
System.out.println(valueType.getName()); // V
// getGenericDeclaration 方法
System.out.println(keyType.getGenericDeclaration()); // class com.test.Test
System.out.println(valueType.getGenericDeclaration()); // class com.test.Test
// getBounds 方法
System.out.println("K 的上界:"); // 有两个
for (Type type : keyType.getBounds()) { // interface java.lang.Comparable
System.out.println(type); // interface java.io.Serializable
}
System.out.println("V 的上界:"); // 没明确声明上界的, 默认上界是 Object
for (Type type : valueType.getBounds()) { // class java.lang.Object
System.out.println(type);
}
}
}