1.泛型是什么
先看一个类
ArrayList类是一个采用类型参数的泛型类,在Java的标准库中
它的使用方法
类名<泛型> 变量名 = new 类名<泛型>(参数);
java
ArrayList<Employee> staff = new ArrayList<>();
类型参数是什么
我们一般方法里面传参是变量,比如整型,浮点型,以及对象
这个就是把类型作为参数传入进去
传入的是类型
自定义的类,异常类,等等
2. 泛型从何而来?
- 2004 年,Java 5(JDK1.5)正式引入。
- 之前没有泛型,集合只能存
Object,什么类型都能往里塞:
java
List list = new ArrayList();
list.add("abc");
list.add(123);
// 取出来必须强转,很容易 ClassCastException
String s = (String) list.get(1);
3. 泛型出现是为了解决什么问题?
三大核心问题:
-
类型不安全 错误类型混入集合,运行时才报错,难排查。
-
强制类型转换太多 每次取元素都要
(String)、(Integer),代码脏、易写错。 -
代码复用差 想写一个 "通用容器 / 通用算法",只能写
Object版,既不安全也不优雅。
泛型的效果:
- 编译期就检查类型,错了直接红,不让你运行;
- 自动转换,不用手写强转;
- 一套代码支持多种类型。
4. 泛型不能在什么时候用?有什么注意要点?
类型参数不能是基本类型 ❌ ArrayList<int> ✅ ArrayList<Integer>(必须用包装类)
5. 泛型为何有效?
靠两点:编译期检查 + 运行时擦除。
-
编译期(写代码时)
- 编译器把
<T>当成真实类型检查; - 不匹配直接报错,把异常拦在运行前;
- 自动插入类型转换,你不用写。
- 编译器把
-
运行时(执行时)
- 泛型信息被擦除 :
ArrayList<Integer>→ArrayList; - 实际存的还是
Object,保证和老代码兼容; - 所以叫 "伪泛型",但对使用者完全够用、安全。
- 泛型信息被擦除 :
一句话:编译期帮你把关,运行时不添负担,还能兼容旧代码。
6. 泛型如何实现(怎么把泛型带入类 / 方法)
java
// 定义:类名后加 <E>
class MyList<E> {
private E data;
public void set(E d) { data = d; }
public E get() { return data; }
}
// 使用:传入具体类型
MyList<Integer> list = new MyList<>();
list.set(10);
Integer x = list.get();