Java 泛型通配符(Wildcard)主要用于泛型类型不确定或不关心具体类型的场景,常见有三种形式:
?表示“任意类型”。
List<?> list;
特点
Objectnull)List<?> list = new ArrayList<String>();
Object o = list.get(0); // OK
// list.add("abc"); // 编译错误
使用场景
public static void printList(List<?> list) {
for (Object o : list) {
System.out.println(o);
}
}
? extends T表示“T 或其子类”。
List<? extends Number> list;
特点
TList<? extends Number> list = new ArrayList<Integer>();
Number n = list.get(0); // OK
// list.add(1); // 编译错误
使用场景(生产者 / 读)
public static double sum(List<? extends Number> list) {
double s = 0;
for (Number n : list) {
s += n.doubleValue();
}
return s;
}
? super T表示“T 或其父类”。
List<? super Integer> list;
特点
T 及其子类ObjectList<? super Integer> list = new ArrayList<Number>();
list.add(1); // OK
// Integer i = list.get(0); // 编译错误
Object o = list.get(0); // OK
使用场景(消费者 / 写)
public static void addNumbers(List<? super Integer> list) {
list.add(1);
list.add(2);
}
Producer Extends, Consumer Super
? extends T? super T// 从 src 读,写入 dest
public static <T> void copy(
List<? super T> dest,
List<? extends T> src) {
for (T item : src) {
dest.add(item);
}
}
List<?>:类型未知<T> List<T>:类型已知并可推导// 泛型方法
public static <T> void print(List<T> list) { }
// 通配符
public static void print(List<?> list) { }
❌ 不能 new 通配符类型
List<?> list = new ArrayList<?>(); // 错误
✅ 可以 new 具体类型
List<?> list = new ArrayList<String>();
如果你愿意,我也可以结合 集合 / 接口设计 / 源码示例(如 Collections.sort) 来具体讲。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。