Java面试题:<? extends Number>和<? super Number>的区别

105 阅读1分钟

泛型中上下界限定符extends 和 super

回答

1、定义
  1. extends
    • <? extends T> 表示类型的上界,表示参数化类型的可能是T 或是 T的子类。

image-20250326200514944

  1. super
    • <? super T> 表示类型下界(Java Core 中叫超类型限定),表示参数化类型是此类型的超类型(父类型),直至Object

image-20250326200505193

2、读写操作限制
  1. <? extends T>
    • 读取:安全,可读取Number类型数据
    • 写入:禁止,
  2. <? super T>
    • 读取:禁止,
    • 写入:安全,可添加Number或其子类
3、适用场景
场景推荐通配符典型用例
需要读取数据(如遍历)? extends Number处理多种数值类型的集合(如List<Integer>List<Double>
需要写入数据(如添加)? super Number向通用容器中添加数值对象(如List<Object>
需要同时读写避免使用通配符明确指定具体类型(如List<Number>
4、代码示例
// ? extends Number 示例
List<? extends Number> extendsList = new ArrayList<Integer>();
Number num = extendsList.get(0); // 合法
extendsList.add(1); // ❌ 编译错误

// ? super Number 示例
List<? super Number> superList = new ArrayList<Object>();
superList.add(1); // 合法
Object obj = superList.get(0); // 需强制转换