1 概览
Type
是个顶层接口类,它有几个子类和子接口。
Type | WildcardType | ParameterizedType | TypeVariable | GenericArrayType | Class<?> |
---|---|---|---|---|---|
getTypeName() : String | getLowerBounds() : Type[] | getActualTypeArguments() : Type[] | getBounds() : Type[] | getGenericComponentType() :Type | isPrimitive() : boolean,isArray(),isInterface(), isInstance(Object), isAnnotation(), isSynthetic(), |
getUpperBounds() : Type[] | getRawType() : Type | getGenericDeclaration() : D | |||
getOwnerType() : Type | getName() : String | getTypeParameters(): TypeVariable>[] | |||
getAnnotatedBounds() : AnnotatedType[] |
泛型类型和类类型
这里要特别强调一下什么是泛型类型,什么是类(对象)类型?
比如:List<String>
作为方法的返回值.它的泛型类型是ParameterizedType
,它的类类型是List
.
泛型类型只有WildcardType
,ParameterizedType
,TypeVariable
,GenericArrayType
和Class<?>
这五种.
类类型其实就是这个类本身.
2 TypeVariable<D extends GenericDeclaration>
TypeVariable
表示的是泛型类型T
。
GenericDeclaration
表明泛型声明在哪里。泛型的声明一般在以下几个地方:
2.1 在类上声明泛型T
class Student<T> {
}
//获取类上声明的泛型类型T
TypeVariable<Class<Student>>[] typeParameters = Student.class.getTypeParameters();
2.2 方法上声明泛型T`
public <T extends Student> T get(){
return null;`
}
Method method = clazz.getMethod("get");
Type type = method.getGenericReturnType();
//因为方法get的返回类型是泛型类型T,所以type的实际类型是TypeVariable,又因为这个泛型类型T是在方法上声明的
TypeVariable<Method> typeVariable = (TypeVariable<Method>)type;
2.3 构造函数声明泛型
public <T> Student(T t){
}
//获取泛型类型T
//因为构造函数的参数类型是泛型类型T,所以这里传入Object
Constructor<Student> constructor = Student.class.getConstructor(Object.class);
//返回构造函数上声明的泛型类型T的数组
TypeVariable<Constructor<Student>>[] typeParameters = constructor.getTypeParameters();
Constructor
和Method
从Executable
继承了方法getTypeParameters()
。
//返回方法上声明的泛型类型T的数组。
TypeVariable<Method>[] typeParameters = method.getTypeParameters();
3 WildcardType
泛型通配符?
,<? extends Number>
等。
4 ParameterizedType
官方解释ParameterizedType represents a parameterized type such as Collection<String>
不明白为什么用的是Parameterized
这个单词。字面意思理解为参数化的类型。很难懂到底是啥。自己的话来说就是这个类型所使用的类一定要带有泛型。
比如方法返回值类型。
public List<String> get(){
return null;
}
get
方法返回值为List<String>
。List
带了泛型。也就是类型所使用的的任何类只要带了泛型,它的类型都是ParameterizedType
。
4.1 getActualTypeArguments
返回的是某层的泛型,并不是所有层次的泛型。
比如:List<Map<String,T>>
。
在List
这一层只有一个泛型类型Map
,而在Map
这一层有两个泛型类型String
和 T
。每次只能获取一个层次的泛型,递归调用才能获取到所有层次的。
4.2 getOwnerType和getRawType
getRawType
:返回泛型本身的类型。比如:List<String>返回的是java.util.List
,而不是List
的父类型Collection
.getOwnerType
:owner
是所有者,也就是谁拥有这个泛型类型。通俗说就是返回内部类的外部类的类型。
比如:
class Component{
interface Builder<T>{
}
}
如果我们的泛型类型是Component.Builder<T>
,那么返回的就是Builder
的外部类类型Component
。
5 GenericArrayType
字面意思就能看出这个类型表示的是个数组。数组元素的泛型类型是什么呢?官方文档做了说明。
{@code GenericArrayType} represents an array type whose component type is either a parameterized type or a type variable.
数组元素的泛型类型有两种:
- 数组元素的泛型类型是
ParameterizedType
。
比如:List<String>[]
,List<String>
的泛型类型是ParameterizedType
。 - 数组元素泛型类型是T,也就是
TypeVariable
类型。
比如:T[]。
对于数组元素类型为具体类型的比如基本变量类型int[]
,明确的对象类型Student[]
和System[]
(自定义的对象类Student,系统的类System),这些元素的泛型类型既不是ParameterizedType
,又不是TypeVariable
,因此这样的数组的泛型类型是Class<?>
,记住是数组不是数组元素.
5.1 getGenericComponentType
component
是组成成分的意思,在这里表示的是数组元素.这个方法返回的是数组元素的泛型类型.
6 Class<?>
基本变量,对象(自定义的类和接口,枚举类),字符串String
,以及以这些类型作为元素类型的数组。都是Class<?>
。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。