java 泛型体系

来源:互联网 发布:dd archlinux mac 编辑:程序博客网 时间:2024/05/28 09:33

这里写图片描述

1.1 AnnotatedElement

表示目前正在此 VM 中运行的程序的一个已注释元素。该接口允许反射性地读取注释。由此接口中的方法返回的所有注释都是不可变并且可序列化的。

1.2 AccessibleObject

在反射时,控制类中属性的访问权限。默认反射是不能访问类的私有方法,但是可以使用AccessibleObject.setAccessible(fields, true); 指定访问权限以访问类的私有属性

1.3 GenericDeclaration

声明类型变量的所有实体的公共接口,也就是说,只有实现了该接口才能在对应的实体上声明类型变量。(个人理解 Array<String> String就是类型变量) 也就是只有实现了这个接口,才能实现泛型。
http://www.cnblogs.com/baiqiantao/p/7475696.html

1.4 Member

可以通过反射获取变量、方法、构造的信息

1.5 Field

封装了公有、私有、静态、实例变量的操作

1.6 Method

封装了公有、私有、静态、实例方法的操作

1.7 Parameter

提供关于方法参数的信息

1.8 Class

类的实例是对象,Class的实例是类或接口,Class类没有公有的构造方法,它由JVM自动调用

1.9 Type类型

它是所有类型的公共接口。包括原始类型、参数化类型、数组类型、类型变量和基本类型。它有四个子类:ParameterizedType, TypeVariable, WildcardType,GenericArrayType。

2、Type类型

2.1 ParameterizedType

参数化类型,形如:Object<T,K>,即常说的泛型。
主要方法:

//1.获得<>中实际类型 如T,KType[] getActualTypeArguments();//2.获得<>前面实际类型 如ObectType getRawType();//3.如果这个类型是某个类型所属,获得这个所有者类型,否则返回nullType getOwnerType();

2.2 TypeVariable

类型变量,如参数化类型中的E、K等类型变量,表示泛指任何类,如果加上extends/super限定,则就会有相应的上限、下限。
主要方法:

//如:class A<X extends C>//获得泛型的上限,若未明确声明上边界则默认为Object。这里是CType[] getBounds();//获取声明该类型变量实体(即获得类、方法或构造器名)。类名AD getGenericDeclaration();//获得名称,即K、V、E之类名称。这里是XString getName();

2.3 GenericArrayType

泛型数组,描述的是ParameterizedType类型以及TypeVariable类型数组,即形如:classA[][]、T[]等

//获得这个数组元素类型,即获得:A<T>[]返回A<T>或T[]返回TType getGenericComponentType();

2.4 WildcardType

通配符表达式,或泛型表达式,它虽然是Type的一个子接口,但并不是Java类型中的一种,表示的仅仅是类似 ? extends T、? super K这样的通配符表达式。

//获得泛型表达式上界(上限)Type[] getUpperBounds();//获得泛型表达式下界(下限)Type[] getLowerBounds();

3、Java类型分类

Java的所有类型包括:

  1. raw type:原始类型,对应Class 指平常所指的类,还包括数组、接口、注解、枚举等结构。
  2. parameterized types:参数化类型,对应ParameterizedType
  3. array types:数组类型,对应GenericArrayType
  4. type variables:类型变量,对应TypeVariable
  5. primitive types:基本类型,仍然对应Class

1). 3中的数组类型GenericArrayType,应该指的是2、4类型数组,而不是一般我们说的数组,我们一般所说的数组是指1、5类型数组,他们还是1,也就是Class类型。
2). List<T ? entends>[]:这里的List就是ParameterizedType,T就是TypeVariable,T ? entends就是WildcardType(注意,WildcardType不是Java类型,而是一个表达式),整个List<T ? entends>[]就是GenericArrayType。

参考:
http://blog.csdn.net/a327369238/article/details/52621043
http://blog.csdn.net/u012422440/article/details/48948921