一、总结
1、List<Number>不是List<Integer>的父类
它们的类型都是List
2、List<?>是所有List<T>的父类
但是List<?>是不能读不能写,只能做些空判断
3、List<? extends Integer>只能读
List<? super Integer>只能写
4、泛型的局限,因为类型擦除(编译器内部永远把所有类型T视为Object处理)
-
<T>不能是基本类型,例如int,因为实际类型是Object,Object类型无法持有基本类型
-
无法取得带泛型的Class
-
无法判断带泛型的类型
-
不能实例化T类型
二、示例代码
// Pair的类型就是Pair,和泛型的类型无关
public static void printGenericType() {
Pair<String> sPair = new Pair<>("hello", "harry");
Pair<Integer> iPair = new Pair<>(12, 3213);
Class sPairClass = sPair.getClass();
Class iPairClass = iPair.getClass();
System.out.println(sPairClass == iPairClass); // true
System.out.println(sPairClass==Pair.class); // true
System.out.println(Pair.class); // class generic.Pair
Pair<Integer> p = new Pair<>(123, 456);
// if (p instanceof Pair<String>) { // 编译错误
// }
}
public class Pair<T> {
private T first;
private T last;
// 编译器会阻止一个实际上会变成覆写的泛型方法定义。
// @Override
// public boolean equals(T t) { // 编译错误
// return this == t;
// }
public Pair() {
// 不能实例化T类型
// T t = new T(); // 编译错误
}
public Pair(T first, T last) {
this.first = first;
this.last = last;
}
public T getFirst() {
return first;
}
public void setFirst(T first) {
this.first = first;
}
public T getLast() {
return last;
}
public void setLast(T last) {
this.last = last;
}
}
public class IntPair extends Pair<Integer>{
public IntPair(Integer first, Integer last) {
super(first, last);
}
}
三、获取泛型类型
通过继承来获取泛型类型
public static void getInheritType() {
Class<IntPair> clazz = IntPair.class;
Type t = clazz.getGenericSuperclass();
if (t instanceof ParameterizedType) {
ParameterizedType pt = (ParameterizedType) t;
Type[] types = pt.getActualTypeArguments(); // 可能有多个泛型
Type firstType = types[0]; // 取第一个泛型
System.out.println(firstType);
Class<?> typeClass = (Class<?>) firstType;
System.out.println(typeClass);
}
}