文章目录
通配符?和T的区别
T: 是一个形参,理解为一个占位符。会在程序运行时替换成具体的类型,为此只关注泛型的方式时,只有在运行时,才能确定T的具体类型是什么。
?: 是一个实参,是Java定义的特殊类型,比Object更特殊。List<Object>
和List<String>
没有关系,List<?>
和List<String>
存在父子关系。如下图
区别一: List<?>
遍历时不关心元素类型,默认元素类型是Object或者父类元素类型
public static <T extends User3> void test3(List<T> list) {
// 遍历的是具体的类型T
for (T t : list) {
System.out.println(t.getStr());
}
}
public static void test2(List<?> list) {
// 遍历顶级元素类型
for (Object obj : list) {
}
}
public static void test2(List<? extends User3> list) {
// 遍历顶级元素类型
for (User3 user : list) {
// 这里的user引用可指向子类对象,执行子类覆盖父类的方法
}
}
区别二: 使用extends限定类型子集的时候,?不能多重继承,T 可以
参考:泛型多继承范围限定