在 Java 中,泛型通配符(Wildcard)是用来表示“未知类型”的特殊符号,主要用在泛型类、泛型接口、泛型方法的声明或使用时,增强代码的灵活性和兼容性。
通配符用问号 ? 表示,主要有三种形式:
?表示任意类型。
List<?> list;
含义:
list 可以指向任何类型的 Listnull)Object示例:
List<?> list = new ArrayList<String>();
Object obj = list.get(0); // 只能当作 Object
// list.add("abc"); // 编译错误
适用场景:
? extends T表示T 或 T 的子类(上限为 T)
List<? extends Number> list;
含义:
Number 及其子类(Integer、Double 等)示例:
List<? extends Number> list = new ArrayList<Integer>();
Number n = list.get(0); // 安全
// list.add(1); // 编译错误
适用场景:
? super T表示T 或 T 的父类(下限为 T)
List<? super Integer> list;
含义:
Integer 及其父类(Number、Object)Object示例:
List<? super Integer> list = new ArrayList<Number>();
list.add(1); // 安全
Object o = list.get(0); // 只能当作 Object
适用场景:
Producer Extends, Consumer Super
? extends T? super T示例(Java 源码常见):
public static <T> void copy(
List<? super T> dest,
List<? extends T> src
) {
for (T item : src) {
dest.add(item);
}
}
<T> void method(List<T> list) { }
vs
void method(List<?> list) { }
区别:
<T>:知道具体类型,可在方法内使用 T?:完全未知,只能当 Object 使用如果你愿意,我也可以用通俗比喻(如“盒子模型”)或面试题角度再给你讲一遍。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。