观察以下未使用泛型的容器操作示例,当开发人员尝试从原始类型容器中提取对象时,必须进行显式类型转换。这种操作方式存在两个显著风险:
public void demo1() throws Exception { List container = new ArrayList(); container.add("developer"); container.add(2023); String user = (String)container.get(0); Integer year = (Integer)container.get(1); System.out.printf("用户:%s | 年份:%d%n", user, year);}
该示例暴露三个关键问题:
问题类型 | 具体表现 |
---|---|
编译期检测缺失 | 类型错误在运行时才会暴露 |
代码可读性差 | 需人工记忆容器元素类型 |
维护成本高 | 类型转换增加代码复杂度 |
通过引入类型参数重构代码,建立编译期的类型约束机制:
public void demo2() { List<String> names = new ArrayList<>(); names.add("John"); // names.add(100); 编译错误 List<Integer> values = new ArrayList<>(); values.add(100); // values.add("text"); 编译错误}
参数化类型带来三大改进:
通过字节码反编译工具观察泛型类型的运行时表现:
// 源代码List<String> list = new ArrayList<>();// 反编译结果ArrayList list = new ArrayList();
这个现象揭示了泛型的实现本质: