【泛型】泛型:泛型擦除、通配符、上下界限定
文章目录泛型泛型擦除、通配符、上下界限定一、泛型基础概述1. 定义2. 核心作用二、泛型擦除Type Erasure1. 概念2. 擦除规则3. 擦除后的处理4. 影响与限制5. 代码示例三、通配符Wildcard1. 概念2. 三种通配符类型3. 核心特性四、上下界限定Bounds1. 概念2. 上界限定extends语法作用限制3. 下界限定super语法作用4. PECS原则最佳实践五、三者的关系与实际应用1. 泛型擦除的底层影响2. 实际开发场景六、总结泛型泛型擦除、通配符、上下界限定一、泛型基础概述1. 定义泛型Generics是Java 5引入的特性允许在类、接口和方法中使用类型参数Type Parameters将类型明确推迟到使用时才指定实现“代码复用 类型安全”。2. 核心作用类型安全编译期检查类型避免运行期ClassCastException。代码复用一套逻辑支持多种数据类型无需重复编写。可读性类型参数明确了代码的意图无需注释说明。二、泛型擦除Type Erasure1. 概念Java泛型是编译期特性JVM运行时无泛型概念。编译器会在编译时“擦除”所有泛型信息将类型参数替换为具体类型或Object保证与旧版JVM兼容。2. 擦除规则类型参数情况擦除后替换为示例无界无extendsObjectListT→ListObject有上界T extends X上界类型XListT extends Number→ListNumber多个上界T extends X Y第一个上界类型XT extends Number Comparable→Number3. 擦除后的处理若类型不匹配编译器会自动插入强制类型转换如String s (String) list.get(0)。若泛型方法冲突编译器会生成桥接方法Bridge Method保证多态。4. 影响与限制无法创建泛型数组如new ListString[5]非法因擦除后为ListObject[]类型不安全。无法获取泛型类型的Class对象如list.getClass()仅返回List.class。静态变量/方法无法使用类的泛型参数静态域在类加载时初始化此时泛型未实例化。5. 代码示例// 编译前ListStringlistnewArrayList();list.add(Java);Stringslist.get(0);// 编译后擦除结果ListlistnewArrayList();list.add(Java);Strings(String)list.get(0);// 自动插入强转三、通配符Wildcard1. 概念通配符?用于表示“未知类型”解决泛型“类型不变性”导致的灵活性问题如ListString不是ListObject的子类。2. 三种通配符类型通配符类型语法作用适用场景无界通配符List?表示“任意类型的List”仅能读取Object工具类中处理“不关心具体类型”的逻辑上界通配符协变List? extends T表示“T或T的子类的List”只读不写生产者场景从集合读取数据下界通配符逆变List? super T表示“T或T的父类的List”只写不读消费者场景向集合写入数据3. 核心特性协变Extends若A extends B则ListA可视为List? extends B的“子类”允许向上转型。逆变Super若A extends B则ListB可视为List? super A的“子类”允许向下转型。四、上下界限定Bounds1. 概念上下界限定用于约束类型参数的范围分为“上界限定extends”和“下界限定super”可单独用于类/方法的类型参数也可与通配符结合。2. 上界限定extends语法类/接口class MyClassT extends Number { ... }方法public T extends Number void method(T t) { ... }通配符List? extends Number作用限制类型参数必须是T或T的子类保证类型安全。可调用T的方法如Number的intValue()。限制仅能读取不能写入因无法确定具体子类类型写入会破坏类型安全。3. 下界限定super语法通配符List? super String类/方法的类型参数不支持单独用super下界仅能与通配符结合作用限制通配符必须是T或T的父类允许写入T或T的子类。读取时仅能得到Object因无法确定具体父类类型。4. PECS原则最佳实践Producer Extends, Consumer Super若集合是生产者提供数据读取用? extends T。若集合是消费者接收数据写入用? super T。五、三者的关系与实际应用1. 泛型擦除的底层影响通配符和上下界限定仅在编译期生效运行时全部擦除为原始类型。桥接方法、强制类型转换是编译器为弥补擦除损失的“补偿机制”。2. 实际开发场景场景技术选型示例代码工具类不关心具体类型无界通配符List?public static void printList(List? list) { ... }读取集合数据生产者上界通配符? extends Tpublic static double sum(List? extends Number list) { ... }写入集合数据消费者下界通配符? super Tpublic static void addIntegers(List? super Integer list) { ... }限制类型参数范围类/方法上界T extends Xclass NumberContainerT extends Number { ... }六、总结核心概念关键作用核心限制泛型擦除兼容旧版JVM实现编译期安全运行期无泛型信息限制数组/静态域等通配符解决类型不变性提升灵活性无界通配符功能受限需结合上下界上下界限定约束类型范围平衡安全与灵活Extends只读Super只写PECS通过“泛型擦除保证兼容性通配符上下界保证灵活性”Java泛型实现了“安全、复用、灵活”的统一。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2448765.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!