泛型通配符与上下界
面试官问:"List<? extends Number> 和 List<? super Number> 有什么区别?"
候选人小韩答:"extends 是上限,super 是下限。"
面试官追问:"为什么读取元素时用 extends,写入元素时用 super?"
小韩说不上来。
面试官又写了一段代码:
小韩彻底卡住了。
【面试官心理】 这道题是 Java 泛型中最容易混淆的知识点。能说出"PECS 法则"和"获取-写入原理"的候选人,说明真正理解了泛型通配符的设计意图。
一、两种通配符对比 🔴
二、为什么 extends 不能写入?🔴
2.1 反证法理解
2.2 为什么 extends 能读取?
三、为什么 super 能写入?🔴
3.1 写入原理
3.2 为什么 super 读取不安全?
四、PECS 法则 🔴
Producer Extends, Consumer Super(生产者用 extends,消费者用 super)
💡
能说出 PECS 法则并用具体代码演示的候选人,面试官会认为有丰富的泛型使用经验。这是 P6 的标准要求。
五、无界通配符 ? 🔴
六、通配符与类型参数的区别 🔴
七、追问升级
面试官:"List<?> 和 List<Object> 有什么区别?"
【面试官心理】
能说出 List<Object> 和 List<?> 差别的候选人,说明理解了通配符的"类型安全性"设计意图。这是泛型进阶的标志。
面试官:"Collections.copy 的签名是什么?为什么这样设计?"