加载中

泛型

文章分类

浏览该分类下的所有文章

4 篇文章 1

什么是桥接方法?

桥接方法是 JDK 1.5 为兼容泛型擦除后产生的编译器合成方法,字节码中标记为 ACC_BRIDGE 与 ACC_SYNTHETIC,可通过 Method.isBridge() 判断。它在以下情况下生成:①实现带泛型参数的接口,编译器为子类补充一个返回 Object、参数为 Object 的方法;②子类覆盖父类方法并使用协变返回类型(返回子类更具体的类型),编译器生成与父类签名相同的桥接方法。参数类型、数量、修饰符提升或 static 方法的覆盖都不会产生桥接方法。生成桥接方法的目的在于保持泛型代码在擦除后的二进制兼容性,使得在运行时通过父类或接口引用调用时仍能正确分派到子类实现,同时避免因类型不匹配而产生的运行时错误。

什么是类型擦除?

Java 泛型在编译后会被擦除,进入 JVM 时只剩原始类型。未限定的类型参数被替换为 Object,限定上限的则替换为上限类型,因而不同类型参数的实例在运行时属于同一类。通过反射可以绕过编译期的类型检查,在已擦除的集合中加入不匹配的元素,体现了 Java 泛型的“伪泛型”本质。

什么是PECS?

PEPS(Producer Extends Consumer Super)是 Java 泛型的核心规则。使用 `? extends T` 表示协变,只能安全读取 T 或其子类元素,不能写入;`? super T` 表示逆变,只能安全写入 T 或其子类,读取时只能得到 Object。文章通过 `List<? extends Fruit>`、`List<? super Fruit>` 示例说明了编译错误的原因,并比较了 Kotlin 中的 `out`(只读)和 `in`(只写)对应关系。还指出数组在 Java 中是协变的,以及 Kotlin 的 `inline` + `reified` 实现了运行时泛型保留。最后总结:读取用 `extends`,写入用 `super`,两者兼顾则不使用通配符。

什么是类型通配符?

类型通配符用于在泛型中表示未知或受限的元素类型。 - `<?>` 表示元素类型未知的 List,是所有具体泛型 List 的父类,但不能向其中写入元素。 - `<? extends T>` 表示元素类型为 T 或其子类的 List,只能读取元素,写入受限。 - `<? super T>` 表示元素类型为 T 或其父类的 List,可安全写入 T 类型元素,读取时只能得到 Object。 文章通过 `GenericDemo` 示例演示了三种通配符的声明方式及合法/非法的赋值情况,帮助理解它们在类型安全和灵活性上的作用。