java之Type接口及其子接口

一. Type接口概述

 自从JDK1.5引入了泛型后,我们便多了一个表示类型的接口,即Type接口。Type 是 Java 编程语言中所有类型的公共高级接口。它们包括原始类型、参数化类型、数组类型、类型变量和基本类型。该接口只有一个默认的方法,表示对该接口的描述,比如参数类型等等。

java之Type接口及其子接口_第1张图片

1.1 Type的子接口

 ①ParameterizedType: 表示参数化类型,比如集合类型Collection等等。

 ②TypeVariable: 类型变量接口,是各种类型变量的公共高级接口。

③GenericArrayType: 泛型数组类型,即元素类型是参数化类型或者类型变量类型的数组类型。

④WildcardType: 通配符表达式,又叫泛型表达式。

二. GenericDeclaration接口的介绍

 GenericDeclaration接口是声明类型变量的实体的公共接口。常见的反射类Class, Method, Constructor都是该接口的实现类。但Field类没有实现该接口,所以属性上不能声明类型变量。

2.1 GenericDeclaration的方法

该接口只有一个方法 public TypeVariable[] getTypeParameters();该方法返回声明列表上的变量类型的数组。

2.2 测试

java之Type接口及其子接口_第2张图片

我们在类上定义了类型变量T跟V,然后我们调用getTypeParameters()方法来获取该类所声明的变量数组。然后我们遍历获取变量的名称。运行结果如下:

三.  ParameterizedType接口

该接口是参数化类型接口。如List, Set,List等等,即泛型。

3.1 ParameterizedType接口方法介绍

① getActualTypeArguments():这个方法是获取该参数化类型的实际类型的Type对象的数组。

② getRawType():返回声明此参数化类型的接口或类的Type对象。

③getOwnerType(): 返回一个Type对象,此类型是其成员之一。如:参数化类型为Map.Entry,返回就是Map类型。

3.2接口测试:

java之Type接口及其子接口_第3张图片

四. TypeVariable接口

该接口是类型变量接口,如参数化类型中的E, V等类型变量,表示相关一类的类型。

4.1接口方法:

①getBounds():该方法返回的是该类型变量的上限的Type对象的数组。若没有,则默认为Object。

②getGenericDeclaration(): 该方法返回的是声明该类型变量的一般声明。

③getName():返回该类型变量的名称。

4.2测试:

java之Type接口及其子接口_第4张图片

java之Type接口及其子接口_第5张图片

测试结果:

java之Type接口及其子接口_第6张图片

注:类型变量声明不能有下限。上限当然可以,如 ? extends T。我们所传进来的参数类型必定是 T类型(T类型或其子类型),拥有T类型的属性跟方法。但是如果是下限,如 ? super T。传进来的参数不一定有T中的属性跟方法,此时我们无法具体确定,故会报错。

五. GenericArrayType接口

该接口是一种数组类型,数组元素的类型可以是参数化类型或者类型变量。

5.1 接口的方法:

①getGenericComponentType():该方法返回的是数组元素的类型的Type对象。

5.2测试:

java之Type接口及其子接口_第7张图片

测试结果:

六. WildcardType接口

通配符表达式或泛型表达式。如 ? extends T 或 ? super V的格式。

6.1接口方法:

①getUpperBounds():该方法返回的是该类型变量的上界的Type对象的数组。

②getLowerBounds(): 该方法返回的是该类型变量的下界的Type对象的数组。

6.2测试:

java之Type接口及其子接口_第8张图片

测试结果:

java之Type接口及其子接口_第9张图片

七. java中的所有类型

①raw type:原始类型,对应Class。不仅仅是常说的类,还有接口,枚举,注释等等。

②parameterized type:参数化类型,对应ParameterizedType接口。

③array type:数组类型,对应GenericArrayType接口。

④type variable:类型变量,对应TypeVariable接口。

⑤primitive type:基本类型,对应还是Class。

注:WildcardType接口不是java中的类型。它仅仅是一个表达式而已,可能被包含在参数化类型中,如List,或被包含在数组类型中,如List[]。

你可能感兴趣的:(java)