java-泛型

泛型:

泛型是Java 5引入的特性,用来提供类型安全,避免强制类型转换,比如集合框架里的List、Set、Map这些都用到了泛型。比如ArrayList<String>这样,确保只能添加字符串,取出来的时候也不用强转

核心概念

  • 类型参数化
    泛型允许在类、接口、方法中使用类型参数(如 <T>),使用时再指定具体类型:
List<String> list = new ArrayList<>(); // 指定存储String类型
  • 类型安全
    编译器在编译时检查类型,避免运行时类型转换错误(如 ClassCastException)。
  • 类型擦除
    Java 泛型在编译后会擦除类型信息(替换为 Object 或上界类型),运行时无法获取泛型的具体类型。

优点:

  • 泛型在编译时就能检查类型,减少运行时错误

日常应用场景:

  • 集合框架(Collections)
    泛型最典型的应用是集合类,确保集合中元素的类型一致:
List<Integer> numbers = new ArrayList<>(); // 只能添加Integer
Map<String, Integer> map = new HashMap<>(); // Key为String,Value为Integer
  • 自定义泛型类/接口
    定义可复用的通用组件,例如数据库操作的 Dao:
public interface Dao<T> {
    void save(T entity);
    T findById(Long id);
}
  • 泛型方法
    方法可以独立定义类型参数,增强灵活性:
public static <T> T getFirstElement(List<T> list) {
    return list.get(0);
}
  • 工具类与通用逻辑
    例如合并两个数组的工具方法:
public static <T> T[] mergeArrays(T[] arr1, T[] arr2) {
    T[] merged = Arrays.copyOf(arr1, arr1.length + arr2.length);
    System.arraycopy(arr2, 0, merged, arr1.length, arr2.length);
    return merged;
}
  • 通配符与边界(Wildcards)
    • 上界通配符 <? extends T>
      允许读取元素(生产者):
    void printNumbers(List<? extends Number> list) {
    for (Number n : list) System.out.println(n);
    }
    
  • 下界通配符 <? super T>
    允许写入元素(消费者):
    void addNumbers(List<? super Integer> list) {
    list.add(1);
    list.add(2);
    }	
    
  1. API 响应包装
    统一 REST API 响应格式,支持不同类型的数据:
public class Result<T> {
    private int code;
    private String message;
    private T data;
    // 构造方法、Getter/Setter
}

Result<User> userResult = new Result<>(200, "OK", user);
Result<List<Product>> productResult = new Result<>(200, "OK", products);

高级特性:

  • 类型擦除与补偿
    • 泛型信息在编译后被擦除,但可以通过以下方式绕过限制:
    public class MyClass<T> {
    private Class<T> type;
    
    public MyClass(Class<T> type) {
        this.type = type;
    }
    
    public T createInstance() throws Exception {
        return type.getDeclaredConstructor().newInstance();
    }
    }
    
  • 泛型与继承
    List 不是 List 的子类,但可以通过通配符处理:
    void processList(List<?> list) { /* 可接受任意类型 */ }
    

注意事项和限制:

  • 无法实例化泛型类型
    T obj = new T(); // 编译错误
    
  • 不能使用基本类型
    泛型参数必须是引用类型(如 Integer 而非 int)。
  • 数组与泛型
    不能直接创建泛型数组(如 new T[]),可通过反射或 ArrayList 替代。
  • 类型擦除的影响
    运行时无法通过 instanceof 检查泛型类型。

总结

  • 泛型的核心价值:
    • 类型安全:减少运行时错误。
    • 代码复用:编写更通用的逻辑。
    • 代码可读性:明确参数和返回值的类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

在下陈平安

你的鼓励是我创作最大的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值