泛型不是语法糖,而是编译期类型检查机制;其核心价值在于编译阶段拦截不安全操作,避免运行时ClassCastException,并通过不变性、类型参数约定及禁止泛型数组等设计保障类型安全。
泛型不是语法糖,是编译期类型检查机制
Java泛型在字节码层面会被擦除(type erasure),但它的核心价值不在于运行时保留类型信息,而是在编译阶段拦截不安全的类型操作。比如 List 声明后,编译器会拒绝 list.add(123) 这类调用——哪怕底层 ArrayList 实际存储的是 Object[]。
常见误解是“泛型只为避免强转”,其实更关键的是:它把原本运行时才暴露的 ClassCastException 提前到编译期报错,比如:
List nums = new ArrayList();
nums.add("hello"); // 编译失败:incompatible types
这比等到 Integer i = (Integer) nums.get(0); 才抛异常要可靠得多。
为什么不能用 List 接收 List?
这是泛型协变(covariance)限制导致的,Java 中泛型是**不变的(invariant)**。即使 String 是 Object 的子类,List 和 List 之间也不存在继承关系。
立即学习“Java免费学习笔记(深入)”;