Java 泛型面试基础知识

一、Java 泛型核心基础知识

泛型(Generic)是 Java 5 引入的特性,核心目的是在编译期检查类型安全,避免运行时类型转换异常(ClassCastException),同时实现代码复用。

image
2. 泛型的核心作用

🔒 类型安全:编译期检查类型,避免将错误类型的数据放入集合;
🚫 消除强制类型转换:无需手动强转,代码更简洁;
🔄 代码复用:一套泛型代码可适配多种类型,无需为每种类型写重复代码

泛型的「类型擦除」是什么?举例说明其影响

类型擦除是 Java 泛型的实现机制:泛型仅在编译期生效,编译完成后,所有泛型类型参数会被擦除为「原始类型」(无泛型的类型),JVM 运行时无法感知泛型类型。


import java.util.ArrayList;
import java.util.List;

public class TypeErasureDemo {
    public static void main(String[] args) {
        List<String> strList = new ArrayList<>();
        List<Integer> intList = new ArrayList<>();

        // 类型擦除后,strList和intList的实际类型都是ArrayList
        System.out.println(strList.getClass() == intList.getClass()); // 输出:true

        // 反射绕过编译检查,可向String类型的List中放入Integer(运行时无泛型检查)
        try {
            List<String> list = new ArrayList<>();
            list.getClass().getMethod("add", Object.class).invoke(list, 123);
            System.out.println(list); // 输出:[123](编译期报错,但运行期可行)
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

编译期:List 只能添加 String 类型,否则编译报错;
运行期:泛型被擦除为 List,通过反射可放入任意类型,体现「类型擦除」的影响;
核心问题:类型擦除导致泛型无法用于「运行时类型判断」(如 if (list instanceof List) 编译报错)。

面试高频题:? extends T 和 ? super T 的区别(PECS 原则)

Producer Extends: 如果集合是「生产者」(只从中读取数据),用 ? extends T;
Consumer Super: 如果集合是「消费者」(只向其中写入数据),用 ? super T。

posted @ 2026-03-11 10:57  白鹿为溪  阅读(12)  评论(0)    收藏  举报