亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> java

Java 泛型深度解析:类型安全、擦除机制与通配符实战

泛型让类型成为参数,实现编译期类型安全、消除强转、代码复用。Java 泛型采用类型擦除实现,运行期泛型信息被擦除为原始类型。

泛型方法

类型参数声明在返回类型前:<E> void printArray(E[] arr)。调用时编译器推断类型。


public static  void printArray(E[] arr) {
    for (E e : arr) System.out.printf("%s ", e);
    System.out.println();
}

Integer[] ints = {1,2,3}; printArray(ints);  // 推断 E=Integer
String[] strs = {"A","B"};  printArray(strs); // 推断 E=String

有界类型参数

<T extends Comparable<T>> 限制 T 必须实现 Comparable,保证可比较。


public static > T max(T a, T b, T c) {
    T m = a;
    if (b.compareTo(m) > 0) m = b;
    if (c.compareTo(m) > 0) m = c;
    return m;
}
max(3, 4, 5);        // 5
max(6.6, 8.8, 7.7);  // 8.8
max("pear","apple","orange"); // pear (字典序)

多重界限:<T extends A & B & C>(A 为类,其余为接口,类必须在首位)。

泛型类


public class Box {
    private T item;
    public void set(T item) { this.item = item; }
    public T get() { return item; }
}

Box intBox = new Box<>();
intBox.set(100);
Integer i = intBox.get(); // 无需强转

类型擦除与影响

  1. 泛型类型编译后变为原始类型(Box<T> → Box)
  2. 运行期无法区分 List 和 List
  3. 不能:new T()、T[] arr = new T[10]、instanceof T、基本类型作类型参数
  4. 桥接方法:编译器自动生成桥接方法保证多态

擦除导致的问题与对策


// 问题:不能 new T[]
// 对策1:传入 Class 或数组
public  T[] toArray(T[] a) { ... }

// 问题:不能 instanceof List
// 对策:检查原始类型后强转(需开发者保证)
if (obj instanceof List) {
    List list = (List) obj; // 未检查警告
}

通配符

语法含义读/写能力
? extends T上界:T 或其子类只读(获取 T),不可写(除 null)
? super T下界:T 或其父类只写(放入 T),读出仅 Object
?无界:任意类型读出 Object,仅可写 null

PECS 原则

Producer Extends, Consumer Super


// 生产者:复制源到目标
public static  void copy(List dest, List src) {
    for (T t : src) dest.add(t);
}

泛型最佳实践

  1. 优先用泛型方法/类,消除非受检警告
  2. API 设计遵循 PECS,灵活性最大化
  3. 避免原始类型,除非兼容遗留代码
  4. 文档化类型参数约束(如 @param must implement Comparable)
  5. 可变参数泛型方法加 @SafeVarargs 抑制堆污染警告
  6. 泛型数组创建用 Array.newInstance 或列表转数组

java

  1. Java 基本数据类型:8 大类型完整指南与示例
  2. 精通 Java 运算符:类型、语法与实战示例
  3. Java 注释:类型、用法与最佳实践
  4. 精通 Java 增强 for 循环:语法、示例与最佳实践
  5. 精通 Java 字符串:创建、方法与最佳实践
  6. 精通 Java 接口:概念、实现与最佳实践
  7. 精通 Java Try-With-Resources:自动资源管理详解
  8. Java 注解详解:类型、放置位置与实战示例
  9. Java 断言实战指南:尽早发现 Bug 与保障代码可靠性
  10. 掌握 Java 类型转换:从自动拓宽到强制收窄及更多
  11. 掌握 Java 泛型:构建可复用、类型安全的代码
  12. Java 基本数据类型:清晰指南