Java基础教程(七十)泛型:深入解析 Java 泛型,类型安全的代码重用黑科技

一、泛型核心:类型参数化

泛型允许在定义类、接口或方法时使用类型参数(如<T>),使用时指定具体类型(如<String>)。编译器据此进行类型检查。

java

// 泛型类定义
public class Box<T> {
    private T content;
    public void set(T content) { this.content = content; }
    public T get() { return content; }
}

// 使用示例:类型安全保证
Box<String> stringBox = new Box<>();
stringBox.set("Hello");
String value = stringBox.get(); // 无需强制转换,避免ClassCastException
// stringBox.set(100); // 编译错误!类型不匹配

二、类型擦除:泛型的实现机制

Java 泛型是编译期特性。运行时,泛型类型信息被擦除:

  • 无界类型参数(<T>) → Object
  • 有界类型参数(<T extends Number>) → 边界类型(Number

java

// 编译后等效代码示例
public class Box {
    private Object content;
    public void set(Object content) { ... }
    public Object get() { ... }
}

三、边界限定:精确控制类型范围

使用extends约束类型参数的上界,确保类型具备某些能力。

java

public <T extends Number & Comparable<T>> T max(T a, T b) {
    return (a.compareTo(b) > 0) ? a : b;
}
// 可调用:max(10, 20); max(3.5, 2.1);
// 不可用:max("A", "B"); // String不满足Number边界

四、通配符:灵活的子类型处理

通配符? 增强 API 灵活性,处理未知泛型类型:

  • 上界通配符<? extends T>:支持读取(协变),如List<? extends Number>
  • 下界通配符<? super T>:支持写入(逆变),如List<? super Integer>

java

// PECS 原则示例:Producer-Extends, Consumer-Super
public void copy(List<? extends Number> src, List<? super Number> dest) {
    for (Number num : src) {
        dest.add(num); // 安全写入
    }
}

五、泛型方法:独立于类的类型参数化

在方法签名中声明类型参数,作用域仅限于该方法。

java

public static <K, V> boolean compare(Pair<K, V> p1, Pair<K, V> p2) {
    return p1.getKey().equals(p2.getKey()) && 
           p1.getValue().equals(p2.getValue());
}
// 使用:compare(new Pair<>("A", 1), new Pair<>("B", 2));

关键实践:

  1. 优先使用泛型集合List<String> 替代原始 List
  2. 警惕数组与泛型:Java 不支持创建泛型数组(new T[size]非法)。
  3. 利用Class<T>参数:运行时获取类型信息(如T.class.newInstance())。
  4. 类型推断:善用<>钻石操作符(Java 7+)。

结语: Java 泛型通过编译时类型检查消除强制转换错误,大幅提升代码健壮性。深入理解类型擦除、通配符和边界机制,能有效设计高复用、强类型的安全 API,是进阶 Java 开发的核心能力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

值引力

持续创作,多谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值