Type和泛型的关系
Java 5以后加入了泛型特性,关于泛型的类型是什么?就要用到Type 类来描述。
package java.lang.reflect;
public interface Type {
default String getTypeName() {
return this.toString();
}
}
Type 接口有一个我们熟悉的实现类 Class 类, 还有四个接口类型TypeVariable、ParameterizedType、WildcardType、GenericArrayType。
从泛型参数的声明开始
这里的泛型参数指的是 里的 T,可以在三种 位置声明: 类或者接口、 Method、 构造方法 。具体是由GenericDeclaration 这个接口决定的,顾名思义这个接口就是指哪些类上可以声明泛型。
public interface GenericDeclaration extends AnnotatedElement {
public TypeVariable<?>[] getTypeParameters();
}
GenericDeclaration 它的实现类有 Method 、Constructor、Class。
/***
* 泛型参数可以在三种 位置声明: 类或则接口、 Method、 构造方法
* @param <T>
*/
public class GenericDemo<T extends Number> {
private CharSequence name;
// Class 上声明的 泛型参数 T 。
public T t; //t是 TypeVariable 类型
public HashMap<CharSequence, T> hashMap = new HashMap<>(); // hashMap 是 ParameterizedType 类型
public HashMap rawHashMap = new HashMap<>(); // rawHashMap 是 原生类型,所以是 class 类型。
public T[] tArray; // tArray 是 GenericArrayType 类型
public HashMap<? extends CharSequence, T> wildHashMap = new HashMap<>(); // wildHashMap 是 ParameterizedType 类型。 它的第一个参数 ? extends CharSequence 是 WildcardType 。
// 构造方法处声明的泛型参数 E
public <E extends CharSequence> GenericDemo(E e) {
name = e;
}
// 非静态方法上声明的 泛型参数 K
public <K extends T> void setT(K k) {
t = k;
}
// 静态方法上声明的泛型参数 K ,和上面非静态方法的 K 不是同一种类型,不冲突
public static <K>