AI面试总结:wait()和sleep()区别
前言 wait()和sleep()是java面试中比较常见的...
Java面试中偶尔会问泛型中extends和super中的区别?
简单记录一下,方便自己学习和查阅。
<? extends T>就是上界通配符,表示<>中是T或T的子类。
举个例子:
List<? extends Number> list;表示:list 里存的是Number或其子类(如 Integer、Double)
读取
Number n = list.get(0); // OK Integer i = list.get(0); // ❌ 编译错误
为啥第2个错误?
因为list里存放的是Number或者其某一个具体子类,但编译器不知道是哪一个,可能是Integer,也可能Double,所以编译错误。
但是如果返回给其父类(父类引用指向子类),那就是OK。
写入
list.add(10); // ❌ 错误 list.add(10.5); // ❌ 错误 list.add(null); // ✅ 只有 null 允许
编译器不知道list到底是List<Integer>?还是 List<Double>?或者其他的,为了避免类型不安全,禁止写入。
double sum(List<? extends Number> list) { double s = 0; for (Number n : list) { s += n.doubleValue(); } return s; }
<? super T>就是下界通配符,表示<>中是某个T 或 T 的父类
List<? super Integer> list;list里存的是Integer或其父类(Number、Object)。
写入
list.add(10); // ✅ ok list.add(20); // ✅ ok
因为放 Integer 一定是安全的。
读取
Object o = list.get(0); // ✅ ok Integer i = list.get(0); // ❌ 错误
Object是Integer的父类,可以转,但是list存储不一定是Integer,所以第二个是错误
void addNumbers(List<? super Integer> list) { list.add(1); list.add(2); }
Producer → Extends
Consumer → Super
| 角色 | 用谁 |
|---|---|
| 只往外拿数据(生产) | <? extends T> |
| 只往里放数据(消费) | <? super T> |
| 关键字 | 含义 | 能往里放什么 | 能往外取成什么 |
|---|---|---|---|
<? extends T> | 上限通配符 | ❌ 不能放(除了 null) | ✅ 至少 T |
<? super T> | 下限通配符 | ✅ 至少 T | ❌ 只能当 Object |
extends 表示“只读不写”
super 表示“只写难读”
生产者用 extends
消费者用 super
再简单一下:
extends 表示 就是上界通配符,表示<>中是T或T的子类
super 表示下界通配符,表示<>中是某个T或T的父类