AI面试总结:抽象类和接口
前言 java面试中经常被问抽象类(Abstract cla...
面试中会问泛型相关内容,这里简单做一下记录,记录于此,方便自己查看和学习。
Java泛型通过编译期类型检查提升安全性,采用类型擦除实现,配合 PECS 原则 正确使用通配符,是编写健壮、可维护代码的关键。
泛型(Generics)用于在编译期提供类型检查和类型安全。
主要目的:
Java泛型是伪泛型
List<String> list = new ArrayList<>(); // 编译后等价于 List list = new ArrayList();
为什么要用擦除?
为了 向后兼容
上界通配符是用来“读”
List<? extends Number> list;表示:list 中存放的是 Number 或其子类
特点:
原因:
List<Integer> ints = new ArrayList<>(); List<? extends Number> nums = ints; nums.add(1); // ❌ 编译错误
编译器不知道具体是 Integer / Double / Long
Producer(生产者)→ extends
下界通配符是用来“写”
List<? super Integer> list;表示:list 中可以存放 Integer 及其父类
特点:
Consumer(消费者)→ super
Producer Extends, Consumer Super
生产者Extends,消费者Super
| 场景 | 用法 |
|---|---|
| 只从中取数据 | <? extends T> |
| 只往里写数据 | <? super T> |
| 既要读又要写 | 不用通配符 |
class Box<T> { private T value; }
public <T> T getValue(T t) { return t; }
泛型方法不依赖类是否泛型
public static <T extends Comparable<T>> T max(T a, T b)含义:
T t = new T(); // ❌原因:
解决方案:
T t = clazz.newInstance();List<String>[] lists = new List<String>[10]; // ❌原因:
正确方式:
List<?>[] lists = new List<?>[10];ParameterizedType type = (ParameterizedType) getClass().getGenericSuperclass();