JAVA基础-Type类型

66 阅读2分钟

Type类型概念

Type是Java 编程语言中所有类型的公共高级接口。
在JDK1.5之前,所有的原始类型都通过字节码文件类Class进行抽象。Class类的一个具体对象就代表一个指定的原始类型。
JDK1.5加入了泛型类,扩充了数据类型,从只有原始类型基础上扩充了 参数化类型、类型变量类型、通配符类型、泛型数组类型。
Type是Java语言中所有类型(Class)的公共父接口。

Type类关系图

image.png 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);
        }
    }
}