本文目录#

泛型的目标#

泛型提供编译期类型检查与类型参数化,避免大量强制转换并提升代码复用度。JVM 通过类型擦除实现泛型,与 C# 的泛型实现不同。

类型擦除机制#

  • 编译期泛型信息用于类型检查;
  • 运行期擦除为原始类型(类擦除为上界、接口擦除为 Object);
  • 编译器生成桥接方法以保持多态。

通配符与上下界#

  • ? extends T:上界通配符,生产者使用,协变读取;
  • ? super T:下界通配符,消费者使用,逆变写入;
  • PECS 原则:Producer Extends, Consumer Super。

常见模式#

1
2
3
4
5
6
7
8
9
10
11
// 泛型方法
<T extends Comparable<T>> T max(List<T> list) { ... }

// 自定义泛型类
class Pair<K, V> {
private final K key;
private final V value;
}

// 类型令牌
<T> T deserialize(String json, Class<T> type)

限制与注意事项#

  • 不支持基本类型泛型,需使用包装类型或 IntStream 等专用接口;
  • 不能创建泛型数组 new T[]
  • instanceof 与泛型参数无关,需结合通配符;
  • 运行期无法获取泛型参数类型,可使用 TypeTokenParameterizedType

反例分析#

  • 原始类型(Raw Type)导致类型安全丢失;
  • 使用泛型进行类型检测(list instanceof List<String>)非法;
  • 泛型与可变参数结合需加 @SafeVarargs 并谨慎使用。

自检清单#

  • 是否正确选择上界/下界通配符?
  • 是否避免原始类型与不安全转换?
  • 是否理解类型擦除导致的限制并采取替代方案?

参考资料#


本作品系原创,采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,转载请注明出处。