加载中

泛型

文章分类

浏览该分类下的所有文章

4 篇文章 1

什么是桥接方法?

桥接方法是 JDK 1.5 为实现泛型向前兼容而由编译器自动生成的合成方法,在字节码中标记为 ACC_BRIDGE 与 ACC_SYNTHETIC。它在以下情况下出现:①实现了带类型参数的接口或抽象类,编译后会生成返回 Object 或 Object 参数的桥接实现;②子类覆盖父类方法且返回类型向上转型(协变返回),编译器生成返回 Object 的桥接方法。参数类型、访问修饰符或 static 方法的改变均不会产生桥接方法。桥接方法的作用是弥补泛型擦除后方法签名不匹配的问题,保证在运行时通过父类或接口引用调用时仍能正确分派到子类的实际实现,从而实现向后兼容并避免类型错误。

什么是类型擦除?

Java 泛型在编译阶段会被擦除,进入 JVM 后所有类型参数都消失,未限定的泛型被替换为 Object,限定的则替换为其上限(如 CharSequence)。因此不同泛型实例在运行时属于同一类,字段的实际类型也是 Object 或上限类型。由于类型擦除,编译时的类型安全可以通过反射绕过,例如使用反射调用 ArrayList 的 add(Object) 方法即可向 Integer 列表中加入字符串。整体说明了 Java 泛型的“伪泛型”本质及其在运行时的表现。

什么是PECS?

PECS(Producer Extends, Consumer Super)是 Java 泛型中处理协变和逆变的准则。使用 `? extends T` 表示只能读取 T 或其子类的元素,写入被禁止;`? super T` 则只能写入 T 或其子类,读取只能得到 Object。文章通过 `List<? extends Fruit>` 与 `List<? super Fruit>` 的代码示例,说明了两者在赋值、添加和取值时的编译限制,并对比了 Kotlin 中的 `out`(只读)和 `in`(只写)变型。还提及数组的协变特性以及 Kotlin 的泛型实化(`inline` + `reified`)能够在运行时保留类型信息。最后总结:读取用 `extends`,写入用 `super`,若需兼顾读写则不使用通配符。

什么是类型通配符?

类型通配符用于表示不同泛型 List 的父类,分为三类:①无界通配符 `<?>`,表示元素类型未知的 List,可匹配任何类型,但不能向其中写入元素;②上界通配符 `<? extends Type>`,如 `List<? extends Number>`,表示元素类型为指定类型或其子类,只能读取,不能写入;③下界通配符 `<? super Type>`,如 `List<? super Number>`,表示元素类型为指定类型或其父类,只能写入,读取时只能得到 Object。示例代码演示了这三种通配符在声明 List 时的合法写法及不合法的情况,帮助理解其约束与使用场景。